Pergunta

Eu tenho um aplicativo simples em que eu preciso para permitir que o usuário selecione um shader (HLSL .fx ou conjunto de arquivos, possivelmente, com vários passes, mas todos e só pixel shader) e visualizá-lo.

As aplicativo é executado, a lista de shaders vem para cima, e um botão de lançamentos da "janela de visualização". A partir desta janela de visualização (que tem uma janela DirectX no mesmo), o usuário seleciona uma imagem e do shader é executado em que a imagem e exibido. Apenas um quadro necessidades prestados (não em tempo real).

Eu tenho um vértice / pixel shader set combinação, até que leva um quad e torna-lo para a tela, texturizado com a imagem escolhida. Isso funciona perfeitamente. Eu preciso, em seguida, executar um outro efeito, puramente pixel shader, na saída do primeiro efeito, e exibir a imagem final (processado-post) para a tela. Isso não funciona em todos.

Eu tentei para os últimos dias para fazê-lo funcionar, mas sem nenhuma razão aparente, os blocos de código idênticas usada para processar cada efeito só tornar o primeiro. Posso adicionar o segundo arquivo shader como uma segunda passagem no primeiro arquivo de shader e funciona perfeitamente (embora completamente derrota meu objetivo de visualizar shaders criados pelo usuário). Quando eu tento usar um segundo efeito (que carrega e compila apenas multa), ele não faz nada. Eu tomei os resultados do primeiro shader (com GetRenderTargetData) e colocou-os em uma superfície de textura e (destTex e destSur), em seguida, defina essa textura como entrada para a segunda passagem (usando dev-> SetTexture e mais tarde efeito-> SetTexture ( "thisframe", destTex)).

Todas as chamadas de sucesso, efeitos compilar, texturas carregar, quads são desenhadas, mas o efeito não é visível. Eu suspeitava que a princípio o dispositivo (criado com o processamento vertex software) estava causando o problema, mas que não parece ser o caso (eu tentei com hardware e mista). Além disso, utilizando tanto um dispositivo de HAL e REF (não é um problema, uma vez que a aplicação não é em tempo real de qualquer forma), que segundo sombreador não é visível. Tudo é escrito em C ++ para Direct3D 9.

Foi útil?

Solução

Tente limpar o buffer de profundidade estêncil depois de cada vez que você processar o quad.

Outras dicas

Primeiro criar uma textura, então tornar o primeiro shader diretamente para essa textura. Finalmente tornar o segundo shader com a textura como entrada para o Backbuffer.

Deve haver algum tipo de entrada vértice e processamento vértice (ou de função fixa ou shader) para que o pixel shader a ser executado. Você está fornecendo o shader de vértice, e se assim você tem certeza que faz o que o espera de sombreamento de pixels? O que faz seu olhar chamada de desenho como?

É provavelmente vale a pena olhar um traço PIX do seu aplicativo para ver o que o estado dispositivo é ao tentar usar o efeito do usuário.

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