从Cg顶点着色器获取GlProgram二进制文件

时间:2012-07-29 00:55:38

标签: opengl binary cg vertex-shader

我有一些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);

我用-10初始化长度只是为了看看变量是否会随着glGetProgramiv调用而改变,但我总是得到-10作为结果。

1 个答案:

答案 0 :(得分:1)

  

问题在于我无法从glGetProgramiv和glGetProgramBinary中检索任何值。

当然你不能。您将ARB_vertex_program与 GLSL程序混淆。他们不是同样的事情。

glGetProgramiv接受一个GLSL程序对象(以及其他内容)。 OpenGL给你一个GL_INVALID_VALUE错误的好处是好的,因为第一个参数几乎肯定不是由glCreateProgram创建的有效程序对象。

您无法获得ARB_vertex_program的程序二进制文件。您需要将Cg着色器编译为GLSL,然后使用the standard GLSL compile/link process,并从中获取的二进制文件。