2012-07-29 83 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,并从获取的二进制文件。