这是我写的一个简短的计算着色器:
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
,因此不需要这一点,并且该说明被剥离了。