0

我有一些 Cg 顶点着色器,并希望从中获取已编译的二进制文件以进行缓存。

我加载 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 作为结果。

4

1 回答 1

1

问题是我无法从 glGetProgramiv 和 glGetProgramBinary 检索任何值。

你当然不能。您将 ARB_vertex_program 与GLSL 程序混淆了。他们不是一回事。

glGetProgramiv接受一个 GLSL 程序对象(除其他外)。OpenGL 给你一个GL_INVALID_VALUE错误的可能性很大,因为第一个参数几乎肯定不是由glCreateProgram.

您无法获得 ARB_vertex_program 的程序二进制文件。您需要将 Cg 着色器编译为 GLSL,然后使用标准 GLSL 编译/链接过程,并从中获取二进制文件

于 2012-07-29T21:00:51.783 回答