为什么我的HLSL计算着色器中的指示会跳过



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

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);
}

我正在尝试从无人机上读取顶点数据,应用世界,视图和观点转换。然后根据其屏幕位置读取从后缓冲区中读取颜色以便使用它。

由于某些原因,

的所有4行说明

//用世界空间矩阵乘以顶点模型空间位置

//用Viewspace矩阵乘以顶点世界空间位置

正在跳过,根本不出现在组件中

此外,只有3行

//用Projectionspace矩阵乘以顶点viewspace位置

在大会中存在,甚至没有按顺序执行。就像着色器以后继续做需要在完成之前要计算的位置的事情。

为什么发生这种情况。我绝对没有潜在客户

您基本上写了变量 inputPosition.x,然后您在几行之后覆盖值,而无需读回该变量。因此,编译器认为编写值是浪费时间,并跳过了指令。这就是剥夺了第一个和第二个指令的原因。

在第三个块中,您编写了inputPosition的所有4个组件,但是您永远不会使用inputPositon.z,因此不需要这一点,并且该说明被剥离了。

相关内容

  • 没有找到相关文章