1

我以前使用 GLSL 方式涉足过基本的着色器编程。现在我回到它,使用 Cg 着色器。按照Josh Beam 网站上的教程,我已经实现了所需的功能,能够改变我的着色器,但是我无法在 OpenGL 端操作其中的制服。

GLuint handle;
::glGenProgramsARB(1, &handle);
::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
::glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(pSource), pSource);

while(true)
{
  ::glEnable(GL_FRAGMENT_PROGRAM_ARB);
  ::glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, handle);
  // render
  ::glDisable(GL_FRAGMENT_PROGRAM_ARB);
  // present backbuffer
}

完美运行。如果我尝试这样做::glGetUniformLocationARB(handle, pUniformName),我会收到 GL_INVALID_VALUE 错误。在创建着色器之后和绑定之后都尝试这样做,以获得相同的结果。正如不同的消息来源所建议的那样,我也尝试过::glUseProgramObjectARB(handle),但这也不起作用,并且似乎属于 GLSL 方式(Lighthouse3D 教程)。

我已经仔细检查了制服名称是否正确。

我还找到了一种方法(NeHe 教程),它涉及#include-ing Cg 标头和调用 cg API。这不能使用 OpenGL API-s 吗?(这样做的原因是极简主义;我想让这个功能成为静态库的一部分,我全力以赴最小化编译/链接依赖项的数量。)

4

1 回答 1

3

您混淆了不同的扩展名。

术语“统一”是指用uniform关键字声明的 GLSL 全局变量。ARB 组件着色器没有制服。他们有类似的概念,但他们不称他们为“制服”。glGetUniformLocationARB是一个 GLSL 函数。他们的ARB 汇编术语是“程序本地参数”。这些自然是由glProgramLocalParameterARB一系列函数设置的。

哦,你不应该使用任何以 ARB 结尾的 GLSL 函数。曾经

于 2011-11-15T19:27:05.117 回答