0

我也在 Nvidia Developer 讨论中发布了这个。

http://forums.developer.nvidia.com/devforum/discussion/9946/extracting-numbers-cgfx-shader

我正在学习编写我的第一个 cgfx 着色器——一个地形着色器。所以我只能使用 1 个顶点通道(alpha 通道),我希望它存储 3 个蒙版。我在 3d App Maya 中编写了一个脚本没有问题,我可以将 1 个蒙版存储在十分位,1 个在百分位,1 个在千分位。

每个原始绘制的蒙版都被夹在 0 - .9 处(以防止使用 fmod 归零),因此如果一个顶点具有:

掩码 1 =.857

掩码 2 =.345

掩码 3 -.948

此顶点的组合 Alpha 通道为 = .839

我遇到的问题是我无法在我的着色器中正确地将这些蒙版提取到单独的蒙版中。

如果我输出 Mask1,我会得到正确混合好的遮罩。我这样做:

float Mask1 = (fmod((Mcolor  * 10f ), 10f)) *.111f;

如果我输出 Mask2,我会得到所有这些奇怪的伪像。看起来 mask1 正在将自己推到顶部,即使我只输出 Mask2。我很肯定数学是有效的,我在 Maya 中运行了同样的东西来存储开始的值。谁能告诉我为什么会这样?

甚至:

float Mask2 = frac(Mcolor *10);

这应该只是将掩码 2 推到十分位并擦除掩码 1 会导致相同的伪影。

float Mcolor = In.VertColor.a;
float Mask1 = (fmod((Mcolor  * 10f ), 10f)) *.111f;
float Mask2 = (fmod((Mcolor * 100f ), 10f)) *.111f;

我在 Nvidia 论坛上发布了一些有关该问题的图片,但由于防止垃圾邮件,我无法在此处发布。

http://forums.developer.nvidia.com/devforum/discussion/9946/extracting-numbers-cgfx-shader

非常感谢您的帮助-感谢您通读!如果可以/有时间,请解释您的回复,我是编程新手,所以描述性越强越好!

4

1 回答 1

0

只需向您的顶点着色器添加一个额外的输出值。给它一个“texcoord”语义,例如 float4 Masks: TEXCOORD1;

然后只需分配'OUT.Masks.x'而不是'Mask1','OUT.Masks.y'而不是'Mask2'等

在片段/像素着色器中,只需在输入中包含相同的值(使用连接器结构使其易于管理)并读取“IN.Masks.x”等

于 2012-12-05T00:37:14.600 回答