Несколько текстур не отображается - PullRequest
0 голосов
/ 22 июля 2011

Я новичок в DirectX10.Сейчас я разрабатываю приложение Direct10.Он смешивает две текстуры, которые заполняются вручную в зависимости от ввода пользователя.Текущая реализация:

  1. Создание двух пустых текстур с использованием D3D10_USAGE_STAGING.
  2. Создание представления двух шейдерных ресурсов для привязки к пиксельному шейдеру, поскольку шейдер нуждается в этом.
  3. Скопируйте текстуры в память графического процессора, вызвав CopyResource.

Теперь проблема в том, что я вижу только первую текстуру, но не вижу вторую.Мне кажется, что привязка не работает для второй текстуры.

Я не знаю, что с ним не так.Может ли кто-нибудь здесь пролить мне свет на это?

Спасибо, Маршалл

Класс COverlayTexture отвечает за создание текстуры, создание представления ресурсов, заполнение текстуры отображенным растровым изображением из другого приложения ипривязать вид ресурса к пиксельному шейдеру.

HRESULT COverlayTexture::Initialize(VOID)
{
D3D10_TEXTURE2D_DESC texDesStaging;
texDesStaging.Width = m_width;
texDesStaging.Height = m_height;
texDesStaging.Usage = D3D10_USAGE_STAGING;
texDesStaging.BindFlags = 0;
texDesStaging.ArraySize = 1;
texDesStaging.MipLevels = 1;
texDesStaging.SampleDesc.Count = 1;
texDesStaging.SampleDesc.Quality = 0;
texDesStaging.MiscFlags = 0;
texDesStaging.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesStaging.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;  
HR( m_Device->CreateTexture2D( &texDesStaging, NULL, &m_pStagingResource ) );

D3D10_TEXTURE2D_DESC texDesShader;
texDesShader.Width = m_width;
texDesShader.Height = m_height;
texDesShader.BindFlags = D3D10_BIND_SHADER_RESOURCE;
texDesShader.ArraySize = 1;
texDesShader.MipLevels = 1;
texDesShader.SampleDesc.Count = 1;
texDesShader.SampleDesc.Quality = 0;
texDesShader.MiscFlags = 0;    
texDesShader.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
texDesShader.Usage = D3D10_USAGE_DEFAULT;    
texDesShader.CPUAccessFlags = 0;
HR( m_Device->CreateTexture2D( &texDesShader, NULL, &m_pShaderResource ) );

D3D10_SHADER_RESOURCE_VIEW_DESC viewDesc;
ZeroMemory( &viewDesc, sizeof( viewDesc ) );
viewDesc.Format = texDesShader.Format;
viewDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MipLevels = texDesShader.MipLevels;
HR( m_Device->CreateShaderResourceView( m_pShaderResource, &viewDesc, &m_pShaderResourceView ) );
}

HRESULT COverlayTexture::Render(VOID)
{
m_Device->PSSetShaderResources(0, 1, m_pShaderResourceView);

D3D10_MAPPED_TEXTURE2D lockedRect;
m_pStagingResource->Map( 0, D3D10_MAP_WRITE, 0, &lockedRect );

// Fill in the texture with the bitmap mapped from shared memory view

m_pStagingResource->Unmap(0);

m_Device->CopyResource(m_pShaderResource, m_pStagingResource); 
} 

Я использую два экземпляра класса COverlayTexture, каждый из которых заполняет свою собственную битовую карту своей текстурой соответственно и рендерит с последовательностью COverlayTexture [1], а затем COverlayTexture [0].

COverlayTexture* pOverlayTexture[2];

for( int i = 1; i < 0; i++)
{
     pOverlayTexture[i]->Render()
}

Настройка состояния наложения в файле FX определяется следующим образом:

BlendState AlphaBlend
{
AlphaToCoverageEnable = FALSE;
BlendEnable[0] = TRUE;
      SrcBlend = SRC_ALPHA;
      DestBlend = INV_SRC_ALPHA;
      BlendOp = ADD;
      BlendOpAlpha = ADD;
      SrcBlendAlpha = ONE;
DestBlendAlpha = ZERO;
RenderTargetWriteMask[0] = 0x0f;
};

Пиксельный шейдер в файле FX определяется следующим образом:

Texture2D txDiffuse;
float4 PS(PS_INPUT input) : SV_Target
{
float4 ret = txDiffuse.Sample(samLinear, input.Tex);
return ret;
}

Еще раз спасибо.

Редактировать для Пауло:

Большое спасибо, Пауло.Проблема в том, какой экземпляр объекта должен быть связан с альфа-текстурой или диффузной текстурой.В ходе тестирования я связал COverlayTexture [0] с альфой, а COverlayTexture [1] - с диффузной текстурой.

Texture2D txDiffuse[2];
float4 PS(PS_INPUT input) : SV_Target
{
float4 ret = txDiffuse[1].Sample(samLinear, input.Tex);
float alpha = txDiffuse[0].Sample(samLinear, input.Tex).x;

return float4(ret.xyz, alpha);
} 

Я вызвал PSSetShaderResources для двух представлений ресурсов.

g_pShaderResourceViews[0] = overlay[0].m_pShaderResourceView;
g_pShaderResourceViews[1] = overlay[1].m_pShaderResourceView;
m_Device->PSSetShaderResources(0, 2, g_pShaderResourceViews);

В результате я ничего не вижу.Я также попробовал канал x, y, z, w.

1 Ответ

0 голосов
/ 22 июля 2011

Опубликовать еще код.

Я не уверен, как вы собираетесь смешивать эти две текстуры. Если вы хотите смешать их в пиксельном шейдере, вам нужно сэмплировать их оба, а затем добавить их (или любую другую операцию, которую вам потребовалось) вместе.

Как вы добавляете текстуры вместе? Установив ID3D11BlendState или в пиксельном шейдере?

EDIT:

Вам не нужны две текстуры в каждом классе: если вы хотите записать свою текстуру, вы должны использовать D3D10_USAGE_DYNAMIC. Когда вы сделаете это, вы также можете использовать эту текстуру в качестве ресурса шейдера, поэтому вам не нужно делать шаг m_Device->CopyResource(m_pShaderResource, m_pStagingResource);.

Поскольку вы используете альфа-смешение, вы должны управлять выводом альфа-значения в пиксельном шейдере (компонент w в float4, который возвращает пиксельный шейдер).

Свяжите обе текстуры с пиксельным шейдером и используйте одно значение текстуры в качестве альфа-компонентов:

Texture2D txDiffuse;
Texture2D txAlpha;
float4 PS(PS_INPUT input) : SV_Target
{
    float4 ret = txDiffuse.Sample(samLinear, input.Tex);
    float alpha=txAlpha.Sample(samLinear,input.Tex).x; // Choose the proper channel
    return float4(ret.xyz,alpha); // Alpha is the 4th component
}
...