0

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

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

我想传入一个浮点数组(高度图)。我认为那将是

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

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

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

4

1 回答 1

3

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

制服与输入参数不同。iTexCoord 是一个可变输入,也就是说对于每个顶点,它可以有一个唯一的值。这是使用 glVertexAttribPointer 等命令设置的。诸如顶点坐标、法线、texcoords、顶点颜色之类的东西是您可以使用可变输入的示例。

另一方面,Uniforms 旨在为整个绘图调用或可能在整个程序的整个帧或生命周期中保持静态。它们是用 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 节

于 2012-03-06T09:46:08.597 回答