directX 11 計算シェーダーからテクスチャに書き込もうとしています。ただし、これを画面に表示する方法がわかりません。また、これを行うためにどのような種類のバッファを使用する必要があるかもわかりません。
1760 次
1 に答える
2
スタックオーバーフローへようこそ:)
選択するリソースのタイプはRWTexture2D<float4>
、スワップチェーンを介して画面に直接印刷できるためです。DirectX SDK OIT サンプルを見ることができます。
の関数でRWTexture2D<float4> frameBuffer
アクセスする を宣言しています。SortAndRenderCS
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;
ご覧のとおり、実際には RGBA カラー (各チャネルのバイト) であると の値がありr0
、シフトとマスクを使用して各チャネルを抽出し、正規化します。r1
r2
uint
float4
もちろん、すでに値がある場合は、それを行う必要はありません。次に、それらの lerp を (補間のために) 実行します。繰り返しますが、それを行う必要はありません。興味深いのは、frameBuffer
配列表記とuint2
for 座標を使用してアクセスすることです。
于 2010-07-04T13:57:18.973 に答える