2012-03-06 78 views
0

我想用cg编写着色器(用于ogre3d)。我似乎无法解析我想用作我自己代码的起点的有效着色器。cg着色器参数

这里的着色器的声明:

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还有参数吗?着色器程序的怪物定义也没有列出这些参数。

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

我想float数组(高度图)通过。我认为这将是

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

如果我不通过将着色器只是没有被执行的参数之一(和我的对象将是不可见的,因为它没有纹理)?

有没有更好的方式来调试这些比只是命中/错过和猜测?

回答

3

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

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

制服是另一方面旨在是在程序的整个帧或静态寿命为整个绘图调用,或潜在。它们设置为glUniform *命令。制服可能类似于对象的模型视图矩阵,或者用于照明计算的太阳位置。他们不经常改变。

[编辑]这些特定的命令我认为实际上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

+0

它而努力学习这一点,我不会有词汇来搜索答案发生在我身上。我不得不问,或者只是读一些我能找到的东西,希望能够找到答案。谢谢! – Jay 2012-03-06 12:57:52