我正在使用Windows上的OpenGL项目,使用GLEW提供所提供的Windows标头缺少的功能。对于着色器支持,我使用的是NVIDIA的Cg。我读过的所有文档和代码示例都表明以下是加载使用着色器的正确方法,我在代码中以这种方式实现了这些:
cgCreateContext
创建Cg上下文。cgGLGetLatestProfile
CG_GL_VERTEX
和CG_GL_FRAGMENT
获取最新的顶点和像素着色器配置文件。使用cgGLSetContextOptimalOptions
为两个配置文件创建最佳设置。cgCreateProgramFromFile
创建着色器程序。cgGLLoadProgram
。然后,每个帧,对于使用给定着色器的对象:
cgGLBindProgram
绑定所需的着色器(顶点和/或像素)。cgGLEnableProfile
启用所需着色器的配置文件。cgGetNamedParameter
和各种参数设置功能检索并设置任何所需的均匀着色器参数。cgGLDisableProfile
然而,事情开始变得奇怪。当使用单个着色器时,一切正常,但是使用cgGLLoadProgram
加载第二个着色器的行为似乎使得使用第一个着色器的对象停止渲染。切换绘制顺序似乎可以解决问题,但这几乎不是解决方法。我和我的合作伙伴的笔记本电脑(最近使用英特尔集成芯片组的机器)都会出现此问题。
我使用GeForce GTX 260在我的桌面上测试了相同的代码,一切正常。我只是写下这个,因为我的笔记本电脑GPU与Cg不相处,但我已成功构建并运行使用OGRE graphics engine在我的笔记本电脑上同时使用多个Cg着色器的程序(不幸的是我正在工作的任务on是一个计算机图形课,所以我不能只使用OGRE)。
总之,我很难过。什么是OGRE做我的代码不是?我不正确地使用Cg吗?
答案 0 :(得分:2)
在致电cgGLEnableProfile
之前,您必须致电cgGLBindProgram
。从你的问题来看,你可以反过来这样做。
来自cgGLBindProgram
的Cg文档:
cgGLBindProgram将程序绑定到当前状态。程序必须先加载cgGLLoadProgram才能绑定。此外,必须启用程序的配置文件才能使绑定生效。这可以通过cgGLEnableProfile函数完成。