Pergunta

Até onde eu sei, não podemos ler a Z(profundidade) do valor em OpenGL ES 2.0.Então, eu estou querendo saber como podemos fazer com que o mundo 3D coordenadas de um ponto na tela 2D?

Na verdade, eu tenho alguns pensamentos aleatórios podem funcionar.Desde que nós podemos ler o RGBA valor usando glReadPixels, como sobre nós duplicar o buffer de profundidade e armazená-lo em um buffer de cores(dizer ColorforDepth).É claro que há a necessidade de ser agradável convenção para não perder nenhuma informação do buffer de profundidade.E então, quando precisamos de um ponto de coordenadas do mundo , atribuímos a este ColorforDepth buffer de cores para o framebuffer e, em seguida, processá-lo.Assim, quando usamos glReadPixels para ler as informações de profundidade nesse quadro.

No entanto, isto levará de 1 quadro de flash desde o colorbuffer é um estranho buffer traduzido do buffer de profundidade.Eu ainda estou querendo saber se há alguma forma padrão para obter a profundidade em OpenGL es 2.0?

Thx antecipadamente!:)

Foi útil?

Solução

Usando um HANGAR, você pode processar-se sem apresentar os resultados.Se você está em ES 2.0, o fragment shader pode acessar o atual fragmento de profundidade (em coordenadas de janela) como parte de gl_FragCoord, você pode escrever que a cor da memória intermédia, utilize glReadPixels para obter o resultado de volta e continuar.Como alternativa, você pode carregar o mundo-espaço z como uma variável e de escrita que a partir de seu fragment shader, no caso em que uma maneira mais fácil de contornar.

Para convencer a si mesmo, tentar escrever uma rápida shader que coloca gl_FragCoord.z-out às pressas com baixa precisão, por exemplo,apenas

gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);

Você deve obter uma escala de cinzentos com a intensidade da cor que representa a profundidade.Porque você está na janela de coordenadas, a intensidade vai variar de 0.0 (a mais próxima possível unclipped fragmento) a 1,0 (ponto mais distante possível unclipped fragmento).A fim de não perder um monte de precisão, é provavelmente mais útil para dividir o valor entre os componentes, como o seu fornecedor quase certamente não oferece suporte a ponto flutuante de destino buffers.

Outras dicas

Eu uso uma fundição básica de raios para escolher um objeto 3D em um toque de tela. Na verdade, calcule a interseção entre a tela normal no ponto de toque e uma esfera que contém meu objeto. Para uma escolha muito precisa ou uma forma complicada, você deve usar várias esferas.

Você também pode projetar alguns pontos -chave de você se opor no espaço 2D da sua tela (minha multiplicação do seu ponto 3D pela sua matriz de transformação) e, em seguida, faça uma comparação 2D (distância) com o seu ponto de toque.

Eu também gostaria de poder ler valores no buffer de profundidade, mas a pesquisa está indicando que isso não pode ser feito.

Como Vincent sugere, se você tiver formas simples, como esferas, a fundição de raios provavelmente é melhor.

Para formas mais complexas, estou pensando em renderizar o objeto a um buffer fora da tela (potencialmente menor), atribuindo manualmente um dos componentes de cores de cada vértice para ser a profundidade desse vértice e depois ler os valores de cores. Isso é um tanto deselegante e irritante, e exige que você possa converter espaço de objeto no espaço da tela (estou usando meus próprios quaternions para dirigir as matrizes, o que cuida disso). Pode haver um caminho com os shaders para escrever as informações de profundidade no buffer de cor ou estêncil (os GLS até têm um buffer de estêncil?)

Se alguém tiver uma abordagem mais limpa, eu adoraria ouvi -la.

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