Opengl cg着色器参数

Opengl cg着色器参数,opengl,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,

我正在尝试使用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是纹理。是否将这些参数或其他内容加载到图形卡内存中(如globals)?着色器程序的食人魔定义没有将它们列为参数

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

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

我想传入一个浮动数组(高度贴图)。我想应该是这样

  uniform float splatScaleZ,
  uniform float heightmap[1024]
) 
{...}
如果我不传递其中一个参数,着色器是否就不会执行(并且我的对象将不可见,因为它没有纹理)

除了点击/不点击和猜测之外,还有更好的调试方法吗?

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

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

另一方面,制服在整个抽签过程中是静态的,或者可能在整个程序框架或生命周期中是静态的。它们由glUniform*命令设置。一致性可能类似于对象的modelview矩阵,或用于照明计算的太阳位置。它们不会经常改变

[编辑]我认为这些特定命令实际上适用于GLSL,但理论应该与CG相同。查找特定于cg的教程,了解设置制服和制服的确切命令

covMap1-splat6是纹理。是否将这些参数或其他内容加载到图形卡内存中(如globals)?着色器程序的食人魔定义没有将它们列为参数。

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

从外部程序发送值时,声明顺序是否有意义?

不,这些变量在外部程序中通过其字符串变量名引用

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

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

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

参见第B.3.8节,iTexCoord0显然是一个输入参数。为什么不宣布统一?

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

另一方面,制服在整个抽签过程中是静态的,或者可能在整个程序框架或生命周期中是静态的。它们由glUniform*命令设置。一致性可能类似于对象的modelview矩阵,或用于照明计算的太阳位置。它们不会经常改变

[编辑]我认为这些特定命令实际上适用于GLSL,但理论应该与CG相同。查找特定于cg的教程,了解设置制服和制服的确切命令

covMap1-splat6是纹理。是否将这些参数或其他内容加载到图形卡内存中(如globals)?着色器程序的食人魔定义没有将它们列为参数。

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

从外部程序发送值时,声明顺序是否有意义?

不,这些变量在外部程序中通过其字符串变量名引用

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

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

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


参见第B.3.8节

当我试图学习这一点时,突然想到我没有词汇来搜索答案。我不得不问,或者只是读我能找到的所有东西,希望能在答案上结结巴巴。谢谢当我试图学习这一点时,我突然想到我没有词汇来寻找答案。我不得不问,或者只是读我能找到的所有东西,希望能在答案上结结巴巴。谢谢