【问题标题】:How to get an uniform location of a Cg shader with OpenGL?如何使用 OpenGL 获得 Cg 着色器的统一位置?
【发布时间】:2011-12-29 07:43:25
【问题描述】:

我以前使用 GLSL 方式涉足过基本的着色器编程。现在我回到它,使用 Cg 着色器。按照Josh Beam's website 的教程,我已经实现了所需的功能,能够改变我的着色器,但是我无法在 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 tutorials)。

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

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

【问题讨论】:

    标签: opengl shader uniform cg


    【解决方案1】:

    您混淆了不同的扩展。

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

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

    【讨论】:

    • 感谢您的回复。可悲的是,这是我的一个错字,我打电话给 glGenProgramsARB。正在编辑原文...
    • “哦,你不应该使用任何以 ARB 结尾的 GLSL 函数。永远。”因为这? opengl.org/wiki/Selecting_a_Shading_Language#ARB_assembly
    • @iCE-9:好吧,不应该因为你正在做的事情而这样做,因为你正在使用 ARB 程序集。 ARB 组件与以 ARB 结尾的 GLSL 函数不同,后者来自扩展 ARB_shader_objects。 那个扩展不应该被任何人使用,因为它已经过时了。 GLSL 作为 OpenGL 的核心已经 6 年多了;如果你使用 GLSL,你应该使用核心 GLSL。不知道旧的基于扩展的 GLSL 函数对较新的着色器版本有何反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多