Debugging 为什么跳过HLSL计算着色器中的指令

Debugging 为什么跳过HLSL计算着色器中的指令,debugging,graphics,directx,hlsl,compute-shader,Debugging,Graphics,Directx,Hlsl,Compute Shader,下面是我写的一个简短的计算着色器: struct CSEdgeVertexDetection_Part_02_Type { float3 position; bool isEdgeVertex; }; ByteAddressBuffer byteBuffer : register(t0); Texture2D<float4> prevBackBuffer : register(t1); RWStructuredBuffer<CSEdgeVertexDete

下面是我写的一个简短的计算着色器:

struct CSEdgeVertexDetection_Part_02_Type
{
    float3 position;
    bool isEdgeVertex;
};

ByteAddressBuffer byteBuffer : register(t0);

Texture2D<float4> prevBackBuffer : register(t1);

RWStructuredBuffer<CSEdgeVertexDetection_Part_02_Type> vertexData : register(u1);



[numthreads(64, 1, 1)]
void main(uint3 groupId : SV_GroupID,
             uint groupIndex : SV_GroupIndex)
{
    uint index;
    float4 position;
    float4 inputPosition;

    index = (groupId.x * 64) + groupIndex;
    inputPosition = float4(vertexData[index].position, 1.0f);

    // Multiply Vertex modelSpace position with worldSpace matrix
    position.x = mul(inputPosition, asfloat(byteBuffer.Load4(0)));
    position.y = mul(inputPosition, asfloat(byteBuffer.Load4(16)));
    position.z = mul(inputPosition, asfloat(byteBuffer.Load4(32)));
    position.w = mul(inputPosition, asfloat(byteBuffer.Load4(48)));

    // Multiply Vertex worldSpace position with viewSpace matrix
    position.x = mul(inputPosition, asfloat(byteBuffer.Load4(64)));
    position.y = mul(inputPosition, asfloat(byteBuffer.Load4(80)));
    position.z = mul(inputPosition, asfloat(byteBuffer.Load4(96)));
    position.w = mul(inputPosition, asfloat(byteBuffer.Load4(112)));

    // Multiply Vertex viewSpace position with projectionSpace matrix
    position.x = mul(inputPosition, asfloat(byteBuffer.Load4(128)));
    position.y = mul(inputPosition, asfloat(byteBuffer.Load4(144)));
    position.z = mul(inputPosition, asfloat(byteBuffer.Load4(160)));
    position.w = mul(inputPosition, asfloat(byteBuffer.Load4(176)));

    // We will use inputPosition as destinations from now on since we don't need it anymore
    inputPosition.x = position.x / position.w / 2.0f + 0.5f;
    inputPosition.y = -position.y / position.w / 2.0f + 0.5f;

    inputPosition.x = inputPosition.x * 800.0f;
    inputPosition.y = inputPosition.y * 600.0f;

    inputPosition.x = round(inputPosition.x);
    inputPosition.y = round(inputPosition.y);

    inputPosition.y = 600.0f - inputPosition.y - 1.0f;


    //inputPosition.z = asfloat((prevBackBuffer.Load(int3(asint(inputPosition.x), asint(inputPosition.y), 0)) & 0x000000ff));
    inputPosition.z = prevBackBuffer.Load(int3(asint(inputPosition.x), asin(inputPosition.y), 0)).x;

    vertexData[index].isEdgeVertex = step(inputPosition.z, 1.0f);
}
struct CSEdgeVertexDetection\u Part\u 02\u类型
{
浮动3位;
布尔-伊塞吉顶点;
};
ByteAddressBufferByteBuffer:寄存器(t0);
Texture2D-prevBackBuffer:寄存器(t1);
rwStructuredBufferVertexData:寄存器(u1);
[numthreads(64,1,1)]
空干管(uint3组ID:SV_组ID,
uint组索引:SV_组索引)
{
uint指数;
浮动4位;
浮动4输入位置;
索引=(groupId.x*64)+groupIndex;
inputPosition=float4(顶点数据[索引]。位置,1.0f);
//将顶点模型空间位置与世界空间矩阵相乘
position.x=mul(inputPosition,asfloat(byteBuffer.Load4(0));
position.y=mul(inputPosition,asfloat(byteBuffer.Load4(16));
position.z=mul(inputPosition,asfloat(byteBuffer.Load4(32));
position.w=mul(inputPosition,asfloat(byteBuffer.Load4(48));
//将顶点世界空间位置与视图空间矩阵相乘
position.x=mul(inputPosition,asfloat(byteBuffer.Load4(64));
position.y=mul(inputPosition,asfloat(byteBuffer.Load4(80));
position.z=mul(inputPosition,asfloat(byteBuffer.Load4(96));
position.w=mul(inputPosition,asfloat(byteBuffer.Load4(112));
//将顶点视图空间位置与投影空间矩阵相乘
position.x=mul(inputPosition,asfloat(byteBuffer.Load4(128));
position.y=mul(inputPosition,asfloat(byteBuffer.Load4(144));
position.z=mul(inputPosition,asfloat(byteBuffer.Load4(160));
位置w=mul(输入位置,asfloat(byteBuffer.Load4(176));
//从现在起,我们将使用inputPosition作为目的地,因为我们不再需要它了
inputPosition.x=位置x/位置w/2.0f+0.5f;
inputPosition.y=-position.y/position.w/2.0f+0.5f;
inputPosition.x=inputPosition.x*800.0f;
inputPosition.y=inputPosition.y*600.0f;
inputPosition.x=圆形(inputPosition.x);
inputPosition.y=圆形(inputPosition.y);
inputPosition.y=600.0f—inputPosition.y—1.0f;
//inputPosition.z=asfloat((prevBackBuffer.Load(int3(asint(inputPosition.x)、asint(inputPosition.y)、0))&0x000000ff));
inputPosition.z=prevBackBuffer.Load(int3(asint(inputPosition.x)、asin(inputPosition.y)、0)).x;
vertexData[index].isEdgeVertex=step(inputPosition.z,1.0f);
}
我试图从无人机上读取顶点数据,对其应用世界、视图和透视变换。然后根据它的屏幕位置从后面的缓冲区中读取一种颜色来处理它

出于某种原因,这两个组件的所有4行指令

//将顶点模型空间位置与世界空间矩阵相乘

//将顶点世界空间位置与视图空间矩阵相乘

正在跳过,并且根本不显示在程序集中

而且只有3行从

//将顶点视图空间位置与投影空间矩阵相乘

存在于程序集中,它们甚至不按顺序执行。 就像着色器以后要做的事情一样,需要在完成之前计算位置


为什么会发生这种情况。我绝对没有线索

你基本上是在写变量
inputPosition.x
,然后在几行之后覆盖该值,而不回读该变量。因此,编译器假定编写值是浪费时间,并跳过指令。这就是第一个和第二个指令块被剥离的原因


在第三个块中,您编写了
inputPosition
的所有4个组件,但从未使用
inputPosition.z
,因此不需要该组件,指令也被删除。

如何调用着色器,它在哪个系统上运行?我看到
CSEdgeVertexDetection\u Part\u 02\u Type
struct中有一个bool。bool是不可空投的,这可能会在某些系统上引起问题…请原谅我的简短和缺少引号和格式,但我是在我的手机上写的。。。