0

Cg Vertexシェーダーがいくつかあり、コンパイルされたバイナリをそこからキャッシュに取得したいと考えています。

Cg頂点をロードする方法はglProgramStringARBを使用していますが、その問題は、glGetProgramivとglGetProgramBinaryから値を取得できないことです。

これが私がしていることのサンプルコードです:

CGprogram program = cgCreateProgram(context, CG_SOURCE, source, ...);
const char* programARB = static_cast<char*>(cgGetProgramString(program,
  CG_COMPILED_PROGRAM));
GLuint id;
glGenProgramsARB(1, id);
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, id);
glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
  static_cast<GLsizei>(strlen(programARB)), programARB);
GLint length = -10;
glGetProgramiv(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_BINARY_LENGTH, &lenght);
printf("LENGTH: %d\n", length);

変数がglGetProgramiv呼び出しで変更されるかどうかを確認するために、長さを-10で初期化しましたが、結果として常に-10を取得します。

4

1 に答える 1

1

それに関する問題は、glGetProgramivとglGetProgramBinaryから値を取得できないことです。

もちろんできません。ARB_vertex_programとGLSLプログラムを混同しています。それらは同じものではありません。

glGetProgramivGLSLプログラムオブジェクトを取得します(とりわけ)。GL_INVALID_VALUE最初の引数は、によって作成された有効なプログラムオブジェクトではないため、OpenGLでエラーが発生する可能性がありますglCreateProgram

ARB_vertex_programのプログラムバイナリを取得することはできません。CgシェーダーをGLSLにコンパイルしてから、標準のGLSLコンパイル/リンクプロセスを使用して、そこからバイナリを取得する必要があります。

于 2012-07-29T21:00:51.783 に答える