在Cg中访问OpenGL状态变量

时间:2020-03-05 18:40:17  来源:igfitidea点击:

我需要在我的Cg着色器程序中访问OpenGL状态变量(例如MVP矩阵)。我使用C / C ++代码中的cgGLSetStateMatrixParameter()之类的调用将这些值手动传递给Cg着色器程序。有没有更简单的方法可以做到这一点?

解决方案

回答

如果我们使用的是最新的Cg配置文件(arbvp1和更高版本),则Cg着色器程序实际上可以直接访问OpenGL状态(MVP矩阵,材质和光照设置)。这使编写这些程序的痛苦减轻了。

以下是一些可以访问的状态变量:

所有类型的MVP矩阵:

state.matrix.mvp
state.matrix.inverse.mvp
state.matrix.modelview
state.matrix.inverse.modelview
state.matrix.modelview.invtrans
state.matrix.projection
state.matrix.inverse.projection

灯光和材质特性:

state.material.ambient
state.material.diffuse
state.material.specular
state.light[0].ambient

有关状态变量的完整列表,请参阅《 Cg用户手册》中的"访问OpenGL状态"," OpenGL ARB顶点程序配置文件(arbvp1)"部分。

笔记:

  • 在Cg中访问时,所有OpenGL状态变量均为统一类型。
  • 对于轻型变量,该索引是强制性的。 (例如:在state.light [1] .ambient中为1)
  • 无需启用照明或者灯光以使用Cg中的那些相应的灯光值。但是,需要使用glLight()函数进行设置。