2012-07-29 65 views
0

我有一些Cg頂點着色器並希望從編譯好的二進制文件中緩存。從Cg頂點着色器獲取GlProgram二進制文件

我加載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); 

我初始化長度-10只是爲了看看變量將與glGetProgramiv呼叫改變,但我總是得到-10的結果。

回答

1

問題在於我無法從glGetProgramiv和glGetProgramBinary中檢索任何值。

當然,你不能。你很難將ARB_vertex_program與GLSL程序混淆。他們是不是同樣的事情。

glGetProgramiv需要一個GLSL程序對象(除其他外)。由於第一個參數幾乎肯定不是由glCreateProgram創建的有效程序對象,所以OpenGL給你一個GL_INVALID_VALUE錯誤的可能性很大。

您無法獲得ARB_vertex_program的程序二進制文件。您需要將Cg着色器編譯爲GLSL,然後使用the standard GLSL compile/link process,並從獲取的二進制文件。