我的项目有一个非常奇怪的问题。我尝试使用我的顶点发送索引号,并在HLSL着色器中使用此数字。
但是,当我将此数字设置为一个值,例如1时,着色器从该数字得到一个非常宽的频谱 - 下降到负值,介于0-1和1之间。即使我给出了无意义的数字,像10000
(我使用C#和SlimDX,这是用像素着色器2.0制作的,我也试过3.0。)
int c = 0;
int testValue = 10000;
for (int i = 0; i < tris.Length; i++)
{
vertices[c].Position = tris[i].p0;
vertices[c].Normal = tris[i].normal;
vertices[c].Index = testValue;
vertices[c++].Color = Color.LightBlue.ToArgb();
vertices[c].Position = tris[i].p1;
vertices[c].Normal = tris[i].normal;
vertices[c].Index = testValue;
vertices[c++].Color = Color.LightBlue.ToArgb();
vertices[c].Position = tris[i].p2;
vertices[c].Normal = tris[i].normal;
vertices[c].Index = testValue;
vertices[c++].Color = Color.LightBlue.ToArgb();
}
这就是我创建顶点的方法。除了Index值之外,一切都可以正常工作。我得到了正确的颜色,我得到了正常的法则,我得到了正确的位置。
以下是HLSL代码:
VertexToPixel IndexedRenderedVS( float4 inPos : POSITION, float4 inColor : COLOR0, float3 inNormal : NORMAL, int inIndex : TEXCOORD0)
{
VertexToPixel Output = (VertexToPixel)0;
float4x4 xWorldViewProjection = mul(xWorld, xViewProjection);
Output.Position = mul(inPos, xWorldViewProjection);
if (inIndex < 0)
Output.Color = float4(1, 0, 0, 1);
if (inIndex > 0 && inIndex < 1)
Output.Color = float4(0, 1, 0, 1);
if (inIndex > 1)
Output.Color = float4(0, 0, 1, 1);
//Output.Color = inColor;
return Output;
}
PixelToFrame IndexedRenderedPS(VertexToPixel PSIN)
{
PixelToFrame Output = (PixelToFrame)0;
Output.Color = PSIN.Color;
return Output;
}
最后,我的VertexFormat结构:
internal Vector3 Position;
internal int Color;
internal Vector3 Normal;
internal int Index;
internal static VertexElement[] VertexElements = new VertexElement[]
{
new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
new VertexElement(0, sizeof(float) * 3, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
new VertexElement(0, sizeof(float) * 7, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Normal, 0),
new VertexElement(0, sizeof(float) * 10, DeclarationType.Float1, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
VertexElement.VertexDeclarationEnd
};
internal static VertexFormat Format
{
get { return VertexFormat.Position | VertexFormat.Diffuse | VertexFormat.Normal | VertexFormat.Texture1; }
}
使用这段代码和一个疯狂的索引值(10000 - 我得到相同的图片,无论我给出什么值,0,1,甚至当我把负数放入。它只是不关心我给的是什么)。
我得到这张照片:
任何人都知道我在哪里弄错了?我只是无法找到我放错位置的地方。尝试了大量的顶点声明,改变了着色器内部的所有内容 - 现在我从理念中消失了。
感谢任何帮助。谢谢:))
答案 0 :(得分:1)
在DirectX中,纹理坐标总是浮点数,通常是float2,但有时候是float3或float4(你可以指定一个float1,但如果你这样做,你实际上会在程序集中得到一个float2,运行时会丢弃第二频道)。您在CPU端将其作为int键入,然后在顶点描述中作为float1键入,最后在着色器中作为int键入。我建议输入所有这些作为float2开始。