我正在
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着色器的程序(不幸的是,我目前正在处理的任务是计算机图形课,所以我不能只使用OGRE).
总之,我很难过.什么是OGRE做我的代码不是?我不正确地使用Cg吗?
最佳答案 在调用cgGLBindProgram之前,必须调用cgGLEnableProfile.从你的问题来看,你可以反过来这样做.
从cgGLBindProgram
的Cg文档:
cgGLBindProgram binds a program to the current state. The program must have been loaded with cgGLLoadProgram before it can be bound. Also, the profile of the program must be enabled for the binding to work. This may be done with the cgGLEnableProfile function.