1

以前、GLSL の方法を使用して、基本的なシェーダー プログラミングに手を出しました。今、私は Cg シェーダーを使用して、それに戻ってきました。Josh Beam の Web サイトのチュートリアルに従って、必要な機能を実現し、シェーダーを変更することができましたが、OpenGL 側でユニフォームを操作できませんでした。

GLuint handle;
::glGenProgramsARB(1, &handle);
::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
::glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(pSource), pSource);

while(true)
{
  ::glEnable(GL_FRAGMENT_PROGRAM_ARB);
  ::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
  // render
  ::glDisable(GL_FRAGMENT_PROGRAM_ARB);
  // present backbuffer
}

完璧に動作します。しようとすると::glGetUniformLocationARB(handle, pUniformName)、GL_INVALID_VALUE エラーが発生します。シェーダーを作成した後とバインドした後の両方で、同じ結果にこれを実行しようとしました。さまざまなソースが示唆しているように、私も試しましたが::glUseProgramObjectARB(handle)、これも機能せず、GLSL の方法 ( Lighthouse3D チュートリアル) に属しているようです。

ユニフォームの名前が正しいことを再確認しました。

また、#include-ing Cg ヘッダーと cg API の呼び出しを含むアプローチ ( NeHe チュートリアル)も見つけました。これは OpenGL API を使用して実行できませんか? (これの理由はミニマリズムです。私はこの機能を静的ライブラリの一部にしたいと考えており、コンパイル/リンクの依存関係の数を最小限に抑えることに全力を尽くしています。)

4

1 に答える 1

3

さまざまな拡張子を混同しています。

uniform「均一」という用語は、キーワードで宣言された GLSL グローバル変数を指します。ARB アセンブリ シェーダーにはユニフォームがありません。コンセプトは似ていますが、「ユニフォーム」とは呼んでいません。glGetUniformLocationARBGLSL 関数です。それらのARB アセンブリ用語は「プログラム ローカル パラメータ」です。これらはglProgramLocalParameterARB一連の関数で自然に設定されます。

ああ、ARB で終わる GLSL 関数は絶対に使用しないでください。今まで

于 2011-11-15T19:27:05.117 に答える