我正在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不太协调,但我已经成功地构建并运行了一些程序,在我的笔记本电脑上同时使用几个Cg着色器,使用OGRE图形引擎 (不幸的是,我目前正在做的任务是一个计算机图形类,所以我不能只使用食人魔)。
总之,我很困惑。食人魔在做什么,而我的代码却不是?我是不是不正确地使用了Cg?
发布于 2013-02-21 17:19:01
你必须先打电话给cgGLEnableProfile,然后再打给cgGLBindProgram。从你的问题上看,你似乎是反过来做的。
来自cgGLBindProgram的Cg文档
cgGLBindProgram将程序绑定到当前状态。在绑定程序之前,程序必须已经加载了cgGLLoadProgram。此外,必须启用程序的配置文件才能使绑定工作。这可以用cgGLEnableProfile函数来完成。
https://stackoverflow.com/questions/10401357
复制相似问题