我想从我的 directX 11 计算着色器写入纹理。但是我不知道如何在屏幕上显示它,也不确定我应该使用哪种缓冲区来执行此操作。
问问题
1760 次
1 回答
2
欢迎使用stackoverflow :)
要选择的资源类型是RWTexture2D<float4>
因为您可以通过交换链直接在屏幕上打印它。您可以查看 DirectX SDK OIT 示例:
他们已经声明了RWTexture2D<float4> frameBuffer
他们在 的函数SortAndRenderCS
中访问的 a OIT_CS.hlsl
。
// convert the color to floats
float4 color[3];
color[0].r = (r0 >> 0 & 0xFF) / 255.0f;
color[0].g = (r0 >> 8 & 0xFF) / 255.0f;
color[0].b = (r0 >> 16 & 0xFF) / 255.0f;
color[0].a = (r0 >> 24 & 0xFF) / 255.0f;
color[1].r = (r1 >> 0 & 0xFF) / 255.0f;
color[1].g = (r1 >> 8 & 0xFF) / 255.0f;
color[1].b = (r1 >> 16 & 0xFF) / 255.0f;
color[1].a = (r1 >> 24 & 0xFF) / 255.0f;
color[2].r = (r2 >> 0 & 0xFF) / 255.0f;
color[2].g = (r2 >> 8 & 0xFF) / 255.0f;
color[2].b = (r2 >> 16 & 0xFF) / 255.0f;
color[2].a = (r2 >> 24 & 0xFF) / 255.0f;
float4 result = lerp(lerp(lerp(0, color[2], color[2].a), color[1], color[1].a), color[0], color[0].a);
result.a = 1.0f;
frameBuffer[nDTid.xy] = result;
如您所见,它们具有r0
,r1
和r2
uint
实际上是 RGBA 颜色的值(每个通道一个字节),它们使用移位和掩码提取每个通道并对其进行规范化。
float4
如果您当然已经有了值,则不需要这样做。然后他们做那些 lerps(用于插值)。同样,您不需要这样做。您感兴趣的是他们frameBuffer
使用数组表示法和uint2
for 坐标进行访问。
于 2010-07-04T13:57:18.973 回答