Pergunta

Eu estava pensando, se eu renderizar uma cena usando um shader a que eu passar em uma textura que também acontece a ser o destino de processamento para essa cena será que vai causar qualquer comportamento indesejado?

Então, basicamente:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

o que será esta causa exatamente?

Se eu não limpar o destino de processamento antes de renderização vai a textura ainda trabalham todos o mesmo? Eu só assumir as alterações finais não são escritos na textura até Device-> End é chamado?

Foi útil?

Solução

Eu suponho que você está falando DirectX9. A documentação não diz nada sobre este caso específico, mas posso dizer-lhe o seguinte:

Eu apenas assumir as alterações finais não são escritos na textura até Device-> End é chamado

Esta é uma suposição errada. Pense nisso, você está assumindo todos os pixels de todos os triângulos que você desenhar será armazenada 'em algum lugar' e todas as suas buscas textura executados sem quaisquer pixels sendo escrito de volta para o destino de processamento. Isto requer uma quantidade arbitrária de memória e, portanto, não é possível.

Na prática:

  • o hardware geralmente processos triângulos como eles vêm, muitos de uma só vez
  • ele atualiza o frame buffer (que no seu caso é o apoio memória de textura) quando quer, assumindo que não pode haver condições de corrida

Assim, supondo DX9 não reclamar (experimentá-lo se você realmente quer saber, eu não faço DX9 mais), ele irá ser indefinido.

Dito isso, DirectX10 é ser mais explícito sobre isso ( fonte):

Se nenhum subresources também são atualmente obrigado por ler ou escrever (talvez numa parte diferente do oleoduto), os pontos de ligação será NULL'ed fora para evitar que a mesma a partir de subrecurso sendo lidos e gravados simultaneamente em uma única operação de renderização.

Assim, em DirectX10, a sua configuração de textura será removido pela API.

Outras dicas

Embora eu não possa apontar especificidades, eu tenho certeza que é um comportamento indefinido. O método de utilização de cartão de gráficos para fragmentos de sombreamento pode variar (ver diferentes quantidades de cada vez, etc), mas em qualquer caso prático, que faz mais do que um fragmento de cada vez. Isto significa que você vai ser tanto ler e escrever para os mesmos locais, fazendo com que as condições de corrida. Eu não acho que é recomendado.

O tempo de execução de depuração irá impedi-lo de fazer isso e fornecer um aviso. A versão de tempo de execução "poder" (mas provavelmente não) de trabalho.

O problema vem formar o fato de que há um grande atraso entre o carregamento o pixel de uma textura e ele está sendo usado. Este é fixo através do carregamento de um bloco de texels em um cache. As gravações são tamponada e escrito diretamente para a memória. Assim, você provavelmente vai acabar com um problema que pode ser a leitura de um texel que já pode ter sido atualizado, mas o cache estará fora de data. Se você está apenas lendo o texel que está sendo escrito a ele "pode" trabalho, mas realisticamente tais detalhes de implementação são deixados para os IHVs. Eles estão sob nenhuma obrigação de permitir que isso trabalho.

Como foi dito por outros ... é muito comportamento indefinido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top