以前、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 を使用して実行できませんか? (これの理由はミニマリズムです。私はこの機能を静的ライブラリの一部にしたいと考えており、コンパイル/リンクの依存関係の数を最小限に抑えることに全力を尽くしています。)