Использование байтовых текстур без знака с DirectX 10/11 - PullRequest
2 голосов
/ 24 февраля 2011

Я пытаюсь выполнить некоторую обработку в пиксельном шейдере текстуры.Данные для текстуры поступают из блока памяти 8-битных данных.Проблема, с которой я сталкиваюсь, заключается в том, как читать данные в шейдере.

Код для создания представления текстуры и ресурса:

В OnD3D11CreateDevice:

D3D11_TEXTURE2D_DESC tDesc;
tDesc.Height = 480;
tDesc.Width = 640;
tDesc.Usage = D3D11_USAGE_DYNAMIC;
tDesc.MipLevels = 1;
tDesc.ArraySize = 1;
tDesc.SampleDesc.Count = 1;
tDesc.SampleDesc.Quality = 0;
tDesc.Format = DXGI_FORMAT_R8_UINT;
tDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
tDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tDesc.MiscFlags = 0;
V_RETURN(pd3dDevice->CreateTexture2D(&tDesc, NULL, &g_pCurrentImage));
D3D11_SHADER_RESOURCE_VIEW_DESC rvDesc;
g_pCurrentImage->GetDesc(&tDesc);
rvDesc.Format = DXGI_FORMAT_R8_UINT;
rvDesc.Texture2D.MipLevels = tDesc.MipLevels;
rvDesc.Texture2D.MostDetailedMip = tDesc.MipLevels - 1;
rvDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
V_RETURN(pd3dDevice->CreateShaderResourceView(g_pCurrentImage, &rvDesc, &g_pImageRV));    </code>

в OnD3D11FrameRender:

HRESULT okay;

if( !g_updateDone ) {
    D3D11_MAPPED_SUBRESOURCE resource;
    resource.pData = mImage.GetData();
    resource.RowPitch = 640;
    resource.DepthPitch = 1;
    okay = pd3dImmediateContext->Map(g_pCurrentImage, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);

    g_updateDone = true;
}

pd3dImmediateContext->PSSetShaderResources(0, 1, &g_pImageRV);

Пока не возвращается никаких ошибок, кажется, все работает.

Шейдер HLSL:

//-----  
// Textures and Samplers  
//-----  

Texture2D <int> g_txDiffuse : register( t0 );  
SamplerState g_samLinear : register( s0 );  

//-----  
// shader input/output structure  
//-----  

struct VS_INPUT  
{  
    float4 Position     : POSITION; // vertex position   
    float2 TextureUV    : TEXCOORD0;// vertex texture coords   
};  

struct VS_OUTPUT  
{  
    float4 Position     : SV_POSITION; // vertex position   
    float2 TextureUV    : TEXCOORD0;   // vertex texture coords   
};  

//-----  
// Vertex shader  
//-----  
VS_OUTPUT RenderSceneVS( VS_INPUT input )  
{  
    VS_OUTPUT Output;  

    Output.Position = input.Position;  

    Output.TextureUV = input.TextureUV;   

    return Output;      
}  

//-----  
// Pixel Shader  
//-----  

float4 RenderScenePS( VS_OUTPUT In ) : SV_TARGET  
{   
    int3 loc;  
    loc.x = 0;  
    loc.y = 0;  
    loc.z = 1;  
    int r = g_txDiffuse.Load(loc);  
    //float fTest = (float) r;  

    return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, 1);  
}

Дело в том, что я даже не могуотладьте его в PIX, чтобы увидеть, к чему приводит r, потому что даже при отключенной оптимизации шейдера строка int r = ... никогда не достигается

Я тестировал

float fTest = (float) r;
return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, fTest);

, но это привело бы кв "не может отобразить выражение на набор инструкций пиксельного шейдера", даже если это число с плавающей точкой.

Так как мне читать и использовать 8-битные целые числа из текстуры, и, если возможно, вообще без выборки.

Спасибо за любые отзывы.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

О боже, это действительно старый вопрос, я думал, что он сказал 2012!

Но в любом случае, так как он все еще открыт:

В связи с тем, что GPU оптимизирован для арифметики с плавающей запятой, вы, вероятно, не получите большого преимущества в производительности, если использовать Texture2D<int> над Texture2D<float>.

Вы можете попытаться использовать Texture2D<float>, а затем попробовать:

return float4( In.TextureUV.x, In.TextureUV.y, In.TextureUV.x + In.TextureUV.y, g_txDiffuse.Load(loc));
0 голосов
/ 27 февраля 2011
loc.z = 1;

Здесь должно быть 0, потому что уровни текстурного mip в вашем случае равны 1, а mipmaps начинаются с 0 в HLSL для Load встроенного.

...