cg着色器参数

时间:2012-03-06 01:40:31

标签: opengl cg

我正在尝试使用cg(for ogre3d)编写着色器。我似乎无法解析一个工作着色器,我想用它来作为我自己的代码的起点。

以下是着色器的声明:

void main
(
  float2 iTexCoord0 : TEXCOORD0,

  out float4 oColor : COLOR,

  uniform sampler2D covMap1,
  uniform sampler2D covMap2,
  uniform sampler2D splat1,
  uniform sampler2D splat2,
  uniform sampler2D splat3,
  uniform sampler2D splat4,
  uniform sampler2D splat5,
  uniform sampler2D splat6,

  uniform float splatScaleX,
  uniform float splatScaleZ
) 
{...}

我的问题:

iTexCoord0显然是一个输入参数。为什么不宣布统一?

(oColor显然是输出参数。毫无疑问)

covMap1 - splat6是纹理。这些参数或其他东西是否加载到显卡内存中(如全局变量)?着色器程序的食人魔定义不会将它们列为参数。

splatScaleX和splatScaleZ也是参数吗?着色器程序的食人魔定义也不会将这些列为参数。

从外部程序发送值时,声明顺序是否意味着什么?

我想传入一系列花车(高度图)。我认为那将是

  uniform float splatScaleZ,
  uniform float heightmap[1024]
) 
{...}

如果我没有传递其中一个参数,那么着色器就不会被执行(并且我的对象将因为它没有纹理而不可见)?

有没有更好的方法来调试这些而不仅仅是命中/未命中和猜测?

1 个答案:

答案 0 :(得分:3)

iTexCoord0显然是一个输入参数。为什么不宣布统一?

制服与输入参数不同。 iTexCoord是一个变化的输入,也就是说,对于每个顶点,它都可以具有唯一值。这是通过glVertexAttribPointer之类的命令设置的。像顶点坐标,法线,texcoords,顶点颜色这样的东西就是你可能使用不同输入的例子。

另一方面,制服是针对整个绘图调用的静态,或者可能是整个框架或程序的生命周期。它们使用glUniform *命令设置。均匀可能类似于对象的模型视图矩阵,或者用于照明计算的太阳位置。它们不会经常变化。

[edit]我认为这些特定的命令实际上与GLSL一起使用,但CG的理论应该是相同的。查找cg特定教程,找出设置变化和制服的确切命令。

covMap1 - splat6是纹理。这些参数或其他东西是否加载到显卡内存中(如全局变量)?着色器程序的食人魔定义不会将它们列为参数。

我的CG有点生锈,但如果它与GLSL相同,那么sampler2d是一个统一,它采用一个索引来表示你要从哪个采样器中采样。当您执行glActiveTexture(GL_TEXTURE3),glBindTexture(n)之类的操作时,可以将采样器均匀设置为“3”,您可以从该纹理中进行采样。

从外部程序发送值时,声明顺序是否意味着什么?

不,变量在外部程序中通过字符串变量名称引用。

如果我没有传递其中一个参数,那么着色器就不会被执行(并且我的对象将因为没有纹理而不可见)?

未知。它们可能具有“一些”初始值,但是这是否有意义且会产生任何可见的东西很难猜测。

有没有更好的方法来调试这些而不仅仅是点击/错过并猜测?

http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_b.html 见B.3.8节