Question

Je suis en train de mettre en œuvre la technique décrite à: assemblant des images avec la profondeur .

L'idée est d'utiliser une texture existante (chargée à partir d'une image) comme un masque de profondeur, 3D fondamentalement faux.

Le visage I problème est que glDrawPixels n'est pas disponible dans OpenGLES. Y at-il un moyen d'accomplir la même chose sur l'iPhone?

Était-ce utile?

La solution

Le tampon de profondeur est plus obscurci que vous pensez dans OpenGL ES; non seulement est absente, mais glDrawPixels gl_FragDepth a été retiré de GLSL. Donc, vous ne pouvez pas écrire un fragment shader personnalisé aux valeurs bobine dans la mémoire tampon de profondeur que vous pourriez pousser les couleurs.

La solution la plus évidente consiste à emballer vos informations de profondeur dans une texture et d'utiliser un fragment shader personnalisé qui fait une comparaison approfondie entre le fragment et il génère une regardé d'une texture que vous fournissez. Seulement si le fragment généré est plus proche est-il permis de procéder. Le tampon de profondeur normale attraper d'autres cas d'occlusion et - en principe - vous pouvez utiliser un objet framebuffer pour créer la texture de profondeur, en premier lieu, vous donnant un complet sur GPU voyage aller-retour, bien qu'il ne soit pas directement pertinent à votre problème.

Les inconvénients sont que le dessin vous coûtera une unité de texture supplémentaire et les textures utilisent des composants entier.

EDIT: aux fins de maintenir le simple exemple, supposons que vous emballer tous vos informations de profondeur dans le canal rouge d'une texture. Ce serait vous donner une très faible profondeur de mémoire tampon de précision, mais juste pour garder les choses claires, vous pouvez écrire un fragment shader rapide comme:

void main()
{
    // write a value to the depth map
    gl_FragColor = vec4(gl_FragCoord.w, 0.0, 0.0, 1.0);
}

profondeur de magasin Pour dans le canal rouge. Donc, vous avez partiellement recréé l'ancienne extension de la texture de profondeur - vous aurez une image qui a un brillant rouge en pixels qui sont plus proches, plus sombre rouge en pixels qui sont plus loin. Je pense que dans votre question, vous auriez fait charger cette image à partir du disque.

Pour utiliser ensuite la texture dans un shader futur fragment, vous feriez quelque chose comme:

uniform sampler2D depthMap;

void main()
{
    // read a value from the depth map
    lowp vec3 colourFromDepthMap = texture2D(depthMap, gl_FragCoord.xy);

    // discard the current fragment if it is less close than the stored value
    if(colourFromDepthMap.r > gl_FragCoord.w) discard;

    ... set gl_FragColor appropriately otherwise ...
}

EDIT2: vous pouvez voir une cartographie beaucoup plus intelligent de de la profondeur à une valeur RGBA ici . Pour attacher directement à ce document, OES_depth_texture est certainement pas pris en charge sur l'iPad ou la troisième génération d'iPhone. Je n'ai pas exécuter un test complet ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top