Pergunta

Eu tenho algum código OpenGL que se comporta de forma inconsistente entre diferentes hardware. Eu tenho algum código que:

  1. Cria uma renda tampão e liga-se uma textura para o seu tamp de cor (Textura A)
  2. define este tornar tampão como ativo, e ajusta o visor, etc
  3. Ativa um pixel shader (Gaussian Blur, neste caso).
  4. Desenha um quad para a tela cheia, com textura A nele.
  5. libera o renderbuffer, etc.

Na minha máquina de desenvolvimento esta multa funciona, e tem o pretendido efeito de desfoque a textura "no lugar", porém em outro hardware este não parece trabalho.

Eu comecei-lo a duas possibilidades.

A) Fazendo um renderbuffer render a si não é suposto trabalho, e só funciona em minha máquina de desenvolvimento devido a algum tipo de acaso.

ou

B) Esta abordagem deve funcionar, mas alguma coisa está acontecendo de errado.

Todas as idéias? Honestamente, eu tive um tempo difícil encontrar detalhes sobre este assunto.

Foi útil?

Solução

A) é a resposta correta. Renderização no mesmo tampão durante a leitura a partir dele é indefinido. Pode funcionar, talvez não -. Que é exatamente o que está acontecendo

O caso de Em OpenGL, framebuffer_object extensão tem seção "4.4.3 Rendering quando uma imagem de um objeto Texture encadernado é também conectados ao framebuffer", que diz o que acontece (basicamente, indefinido). Em Direct3D9, o tempo de execução de depuração reclama em voz alta se você usar essa configuração (mas pode funcionar, dependendo hardware / driver). Em D3D10 o tempo de execução sempre libera o alvo que é usado como destino, eu acho.

Por isso é indefinido? Uma das razões pelas GPUs são tão rápido é que eles podem fazer um monte de suposições. Por exemplo, eles podem assumir que as unidades que retornam pixels não precisa se comunicar com unidades que escrevem pixels. Então, uma superfície pode ser lido, N ciclos mais tarde, a leitura é concluída, N ciclos posteriores as extremidades pixel shader a sua execução, em seguida, ele colocou em alguns buffers de mesclagem de saída na GPU, e, finalmente, em algum momento ele é escrito para a memória. Além disso, as GPUs rasterizar em ordem "undefined" (uma GPU pode rasterizar em fileiras, outro de alguma forma amigável-cache, outro em totalmente outra ordem), então você não sabe o que partes da superfície será escrito a primeira.

Então, o que você deve fazer é criar vários buffers. Em borrão caso / brilhar, dois é geralmente suficiente - processar em primeiro lugar, em seguida, ler e borrão que ao escrever em segundo. Repita este processo, se necessário, em forma de ping-pong.

Outras dicas

Em alguns casos especiais, até mesmo o backbuffer pode ser suficiente. Você simplesmente não fazem um glClear, eo que você desenhou anteriormente ainda está lá. A ressalva é, é claro, que você realmente não pode ler a partir do backbuffer. Mas, para efeitos como fade in e out, isso funciona.

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