Как вы отображаете что-то, используя DirectX 11 вычислительный шейдер? - PullRequest
2 голосов
/ 03 июля 2010

Я хочу записать текстуру из моего вычислительного шейдера DirectX 11.Однако я понятия не имею, как отобразить это на экране, и я не уверен, какой буфер я должен использовать для этого.

1 Ответ

2 голосов
/ 04 июля 2010

добро пожаловать в stackoverflow:)

Тип ресурса для выбора - 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;

Как вы можете видеть, они имеют значения r0, r1 и r2 uint, которые на самом деле являются цветами RGBA (байт для каждого канала), они извлекают каждый канал, используя сдвиги и маски, и нормализуют его. 1016 *

Вам не нужно делать это, если у вас уже есть float4 значения, конечно. Затем они делают эти лепры (для интерполяции). Опять же, вам не нужно этого делать. Что вас интересует, так это то, что они получают доступ к frameBuffer, используя обозначение массива и uint2 для координат.

...