我正在尝试使用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节