Renderização de outdoor sem distorção?

8

Eu uso a abordagem padrão para billboard no Unity que está OK, mas não é o ideal:

transform.LookAt(camera)

O problema é que isso introduz distorção nas bordas da janela de visualização, especialmente quando o ângulo do campo de visão aumenta. Isso é diferente do outdoor perfeito que você veria, por exemplo. Desgraça ao ver um inimigo de qualquer ângulo e independentemente de onde ele esteja localizado no espaço da tela.

Obviamente, existem maneiras de mesclar uma imagem diretamente na viewport, centrada em torno de um único vértice, mas não gosto de shaders.

Alguém tem alguma amostra dessa abordagem (GLSL, se possível), ou alguma sugestão de por que não é normalmente feita dessa maneira (versus o método de transformação em quadra mencionado acima)?

Edição: Eu estava confuso, obrigado Nathan pela atenção. Obviamente, fazer com que os quads olhem para a câmera não os torna paralelos ao plano de visualização - e é disso que eu preciso.

Engenheiro
fonte

Respostas:

4

Estou confuso com sua pergunta, porque em uma projeção em perspectiva padrão, desenhar um outdoor paralelo ao plano da vista não gera distorção. É equivalente a mesclar a imagem na viewport com alguma escala, onde a escala depende da profundidade (distância perpendicular ao plano da vista).

A "distorção" que você está vendo pode acontecer se o sistema estiver realmente orientando as partículas para a câmera e não para o plano de visualização; isso causa inclinação perto das bordas da tela. Ou você pode estar vendo que a escala do sprite muda à medida que você gira a câmera, pois quando a distância é medida no plano de visualização e não na câmera, o sprite fica "mais próximo" e, portanto, maior à medida que sai da tela.

Nathan Reed
fonte
11
@NickWiggill Não estou familiarizado com o Unity especificamente, mas se você deseja que os quadríceps estejam voltados para o plano de visualização em vez de virados para a câmera, você basicamente define a matriz de rotação do quadrante igual à matriz de rotação da câmera. Você pode precisar de uma rotação extra de 180 graus, dependendo de como os quadríceps são construídos.
Nathan Reed
1

Eu acredito que você pode definir a matriz 3x3 superior (na coluna principal) para a identidade para fazer isso. Não vejo nenhuma razão para que você não possa fazer isso no shader, mas talvez esteja fazendo mais trabalho dessa maneira. Você perderia escala (em sua matriz de xformações) dessa maneira.

Editar: este artigo foi útil para outdoors e impostores:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Não sei como isso é convencional, mas chamo de "impostor" quando a perspectiva é mantida e de "outdoor" quando não é.

entalhe
fonte
Eu percebi uma coisa Estou usando o Unity iOS / Android, e alguns dos dispositivos mais antigos são o OpenGL ES 1.1 - portanto, um pipeline fixo. Portanto, fazer isso sem sombreador é fundamental aqui. Como eu faria isso sem fazer isso no shader?
Engenheiro de
11
Essa é provavelmente a maneira mais barata de fazê-lo. No meu código, eu tenho uma bandeira nos meus sprites que determina se é outdoor ou impostor antes de fazer chamadas de empate. Quando for esse o caso, simplesmente pego a matriz atual, defino o 3x3 superior como identidade e atualizo a matriz atual.
notlesh
Ah ... aprecio os detalhes extras, mas como não tenho acesso às chamadas GL (o Unity abstrai isso), acho que estou muito ferrado nessa abordagem.
Engenheiro
Você não pode obter ou definir a matriz atual? Eu nunca usei a unidade ... Se não, talvez tente pesquisar "billboarding unidade" ou "impostering unidade"
notlesh