我正在 Windows 上开发 OpenGL 项目,使用 GLEW 来提供所提供的 Windows header 所缺少的功能。对于着色器支持,我使用的是 NVIDIA 的 Cg。我读过的所有文档和代码示例都表明以下是加载 using 着色器的正确方法,并且我已经在我的代码中以这种方式实现了:
cgCreateContext
创建 Cg 上下文。 cgGLGetLatestProfile
和 CG_GL_VERTEX
和 CG_GL_FRAGMENT
获取最新的顶点和像素着色器配置文件。使用 cgGLSetContextOptimalOptions
为两个配置文件创建最佳设置。 cgCreateProgramFromFile
创建着色器程序。 cgGLLoadProgram
加载着色器程序。 然后,对于使用给定着色器的对象,每一帧:
cgGLBindProgram
绑定(bind)所需的着色器(顶点和/或像素)。 cgGLEnableProfile
启用所需着色器的配置文件。 cgGetNamedParameter
和各种参数设置函数检索和设置任何所需的统一着色器参数。 cgGLDisableProfile
然而,事情开始变得奇怪。使用单个着色器时,一切正常,但使用
cgGLLoadProgram
加载第二个着色器的行为似乎会使使用第一个着色器的对象停止渲染。切换绘制顺序似乎可以解决问题,但这很难解决。这个问题出现在我和我伙伴的笔记本电脑上(相当新的带有 Intel 集成芯片组的机器)。我使用 GeForce GTX 260 在台式机上测试了相同的代码,一切正常。我只想把它写下来,因为我的笔记本电脑 GPU 不适合 Cg,但我已经成功地构建并运行了使用 OGRE graphics engine 在我的笔记本电脑上同时使用多个 Cg 着色器的程序(不幸的是,我目前正在处理的任务是计算机图形类,所以我不能只使用 OGRE)。
总之,我被难住了。 OGRE 在做什么而我的代码不是?我是否不正确地使用 Cg?
最佳答案
您必须在调用 cgGLEnableProfile
之前调用 cgGLBindProgram
。从你的问题来看,你似乎是反过来做的。
来自 cgGLBindProgram
的 Cg 文档: