cg着色器参数

  • 本文关键字:参数 cg opengl cg
  • 更新时间 :
  • 英文 :


我正在尝试使用cg编写着色器(适用于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和splatScalZ也是参数吗?着色器程序的食人魔定义也没有将这些列为参数。

当从外部程序发送值时,声明的顺序有什么意义吗?

我想传递一个浮动数组(高度图)。我想那会是

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

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

有没有比点击/错过和猜测更好的方法来调试这些?

iTexCoord0显然是一个输入参数。为什么它没有被宣布为制服

统一格式与输入参数不同。iTexCoord是一个变化的输入,也就是说,对于每个顶点,它都可以有一个唯一的值。这是通过glVertexAttribPointer等命令设置的。顶点坐标、法线、纹理坐标、顶点颜色等都是可以使用不同输入的示例。

另一方面,统一格式在整个绘制调用中是静态的,或者可能在程序的整个框架或生命周期中都是静态的。它们是用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节

相关内容

  • 没有找到相关文章

最新更新