Объемная визуализация на основе 3DTexture

Я пытался получить серию 2D-изображений, одинакового размера и отформатированных как необработанные данные, загрузить в 3D-текстуру и затем отобразить эту 3D-текстуру на экране. Поскольку я все еще довольно новичок в DirectX, я не уверен, что делаю неправильно. Вот соответствующий код:

// Open the image and copy its contents into a buffer

std::ifstream image("head256x256x109", std::ifstream::binary);

int size;
char* buffer;
if (image.is_open()) {
image.seekg(0, image.end);
size = image.tellg();
image.seekg(0, image.beg);
buffer = new char[size];
image.read(buffer, size);
image.close();
} else {
return false;
}

// Convert the data to RGBA data
// Here we are simply putting the same value to R, G, B and A channels.

char* RGBABuffer = new char[ size*4 ];
for( int nIndx = 0; nIndx < size; ++nIndx )
{
RGBABuffer[nIndx*4] = buffer[nIndx];
RGBABuffer[nIndx*4+1] = buffer[nIndx];
RGBABuffer[nIndx*4+2] = buffer[nIndx];
RGBABuffer[nIndx*4+3] = buffer[nIndx];
}

// Create the texture

D3D11_TEXTURE3D_DESC texture_desc;
ZeroMemory(&texture_desc, sizeof(texture_desc));
texture_desc.Width = 256;
texture_desc.Height = 256;
texture_desc.Depth = 109;
texture_desc.MipLevels = 1;
texture_desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
texture_desc.Usage = D3D11_USAGE_DEFAULT;
texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

D3D11_SUBRESOURCE_DATA image_data;
ZeroMemory(&image_data, sizeof(image_data));
image_data.pSysMem = RGBABuffer;
image_data.SysMemPitch = 256 * 4;
image_data.SysMemSlicePitch = 256 * 256 * 4;

d3dResult = d3dDevice_->CreateTexture3D(&texture_desc, &image_data, &texture_);

// Create a sampler

D3D11_SAMPLER_DESC colorMapDesc;
ZeroMemory( &colorMapDesc, sizeof( colorMapDesc ) );
colorMapDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
colorMapDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
colorMapDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
colorMapDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
colorMapDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
colorMapDesc.MaxLOD = D3D11_FLOAT32_MAX;

d3dResult = d3dDevice_->CreateSamplerState( &colorMapDesc, &colorMapSampler_ );

Код шейдера настолько прост, насколько это возможно:

Texture3D colorMap_ : register( t0 );
SamplerState colorSampler_ : register( s0 );

struct VS_Input
{
float4 pos  : POSITION;
float4 tex0 : TEXCOORD0;
};

struct PS_Input
{
float4 pos  : SV_POSITION;
float4 tex0 : TEXCOORD0;
};

PS_Input VS_Main( VS_Input vertex )
{
PS_Input vsOut = ( PS_Input )0;
vsOut.pos = vertex.pos;
vsOut.tex0 = vertex.tex0;

return vsOut;
}

float4 PS_Main( PS_Input frag ) : SV_TARGET
{
return colorMap_.Sample( colorSampler_, frag.tex0 );
}

Теперь я знаю, что мне нужно было бы реализовать какое-то альфа-смешение, чтобы это работало должным образом, но я надеялся, что по крайней мере получу первый фрагмент изображения, показанного с этим. Однако все, что я получаю, это цвет фона, который я установил в своей функции рендеринга:

float clearColor[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
d3dContext_->ClearRenderTargetView( backBufferTarget_, clearColor );

Любая помощь в том, что я могу сделать неправильно, а также любые дополнительные советы, которые мне понадобятся, чтобы достичь этой цели (создание 3D-текстуры из серии изображений и ее отображение на экране), были бы чрезвычайно полезными, поскольку очень мало документации об этом в Интернете.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector