Pergunta

Por padrão, parece que os objetos são desenhados frente para trás. Estou desenhando um objeto 2-D UI e gostaria de criá-la de trás para frente. Por exemplo, eu poderia criar um quadrado branco primeiro, em seguida, criar um quadrado preto ligeiramente menor em cima dela criando assim um painel preto com uma borda branca. Este post teve alguma discussão sobre ele e descreveu este fim como o "pintor de algoritmo", mas em última análise, o exemplo que deu simplesmente prestados os objetos na ordem inversa para obter o efeito desejado. I figura trás para frente (primeiros objetos ir em volta, objetos subsequentes obter desenhar em cima) a prestação pode ser alcançado através de alguma transformação (gOrtho?)?

Além disso, vou falar que eu não estou interessado em uma solução usando uma biblioteca invólucro tais como GLUT.

Eu também descobriram que o comportamento padrão no Mac usando o cacau NSOpenGLView parece desenhar trás para a frente, onde, como em janelas Eu não posso começar este comportamento. O código de configuração no Windows que estou usando é o seguinte:

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
Foi útil?

Solução

A seguinte chamada será desligada testes de profundidade causando objetos a serem desenhados na ordem criada. Este, por sua causa e efeito objetos para desenhar trás para a frente.

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

Certifique-se que você não chamar este:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing

Outras dicas

Para a sua pergunta específica, não há nenhuma maneira padronizada para especificar ordenação profundidade em OpenGL. Algumas implementações podem fazer frente a ordenação profundidade volta por padrão porque é geralmente mais rápido, mas isso não é garantido (como você descobriu).

Mas eu realmente não vejo como isso irá ajudá-lo em seu cenário. Se você desenhar um quadrado preto na frente de um quadrado branco do quadrado preto deve ser desenhado na frente do quadrado branco, independentemente do que pedir que eles estão atraídos, contanto que você tem profundidade buffer ativado. Se eles são realmente coplanar, então nenhum deles é realmente na frente do outro e qualquer algoritmo de profundidade a ordenação pode ser imprevisível.

O tutorial que você postou um link para só falou sobre isso, porque a profundidade de classificação é relevante quando você estiver usando transparência. Mas não me parece que é o que você está depois.

Mas se você realmente tem que fazê-lo dessa maneira, então você tem que fazê-lo sozinho. Primeiro enviar o seu quadrado branco para o pipeline de processamento, forçar a render, e, em seguida, enviar o seu quadrado preto. Se você fazê-lo dessa maneira, e desativar o buffer de profundidade, em seguida, os quadrados podem ser coplanares e você ainda vai ser garantido que o quadrado preto é desenhada sobre o quadrado branco.

ordem de desenho é difícil. Não há uma solução fácil. alogorithm do pintor (objetos ordenar por sua distância em relação ao ponto de vista de sua câmera) é o mais simples, mas como você descobriu, ele não resolve todos os casos.

Gostaria de sugerir uma combinação de algroithm e camadas do pintor. Você constrói camadas de elementos específicos em seu programa. Então você tem uma camada de fundo, objetos camadas, camadas de efeitos especiais e camada de GUI.

Use o algoritmo do pintor em itens de cada camada. Em algumas camadas especiais (como sua camada de GUI), não classificar com o algoritmo do pintor, mas sim por sua ordem de chamada. Você chama isso de quadrado branco primeiro por isso é atraída pela primeira vez.

Desenhar itens que você quer ser em volta um pouco atrás dos itens que você deseja estar na frente. Isto é, efectivamente alterar o valor z (assumindo que z é perpendicular ao plano da tela). Você não tem que mudá-lo muito para obter os itens para desenhar na frente da outra. E se você apenas alterar o valor z ligeiramente, você não deve notar muito de um deslocamento de sua posição desejada. Você poderia até mesmo ir muito extravagante, e calcular o x correta, posição y com base na posição z alterada, de modo que o item aparece onde é suposto ser.

Seu material será desenhado na ordem exata que você chamar as funções glBegin / glEnd. Você pode obter usando o z-buffer-buffer profundidade, e se seus objetos 2D têm diferentes valores de z, você pode obter o efeito desejado dessa maneira. A única maneira que você está vendo o comportamento que você descreve no Mac é se o programa está atraindo coisas em back-to-front ordem manualmente ou usando o z-buffer para alcançar este objetivo. OpenGL de outra forma não tem qualquer funcionalidade automaticamente como você descreve.

Como AlanKley apontou, a maneira de fazer isso é desativar o buffer de profundidade. O algoritmo do pintor é realmente uma técnica de conversão da varredura 2D usada para processar polígonos na ordem correta quando você não tem algo como um z-buffer. Mas você não iria aplicá-lo para 3D polígonos. Você normalmente transformar e projetá-los (manipulação intersecções com outros polígonos) e em seguida, classificar a lista resultante de 2D polígonos por projetaram a sua projetada coordenada z, em seguida, desenhá-los na z-ordem inversa.

Eu sempre pensei do algoritmo do pintor como uma técnica alternativa para a remoção da superfície oculta quando você não pode (ou não quer) usar um z-buffer.

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