2011-10-20 11 views
5

Ive sta provando a realizzare un motore 2.5D con trame di profondità e mappe normali per alcune settimane, non diversamente da cosa viene utilizzato qui Linky. Dopo aver pensato che il disegno di una mappa di profondità nello shader di frammenti da una texture era impossibile a causa di ES 2.0 che mancava la variabile gl_fragDepth, ho trovato un tutorial per iOS dove usavano glBlendEquation con la modalità GL_MIN/GL_MAX per il buffering di profondità "finto" del frammento a una trama framebuffer Linky. Sfortunatamente GLES20.glBlendEquation rende l'applicazione bloccata su entrambi i miei telefoni (SGS 1/2) con UnsupportedOperationException. Quindi mi chiedo se qualcuno ha usato questa funzione per un successo? GL_MIN/GL_MAX sembra mancare anche alle specifiche Opengl ES 2.0 per Android, quindi sono probabilmente sfortunato qui ... Qualche idea?Android GLES20.glBlendEquation non funziona?

BTW Sembra funzionare in GL11Ext ma poiché Im utilizza lo shader di frammenti per la mappatura normale, questo non funzionerà da me.

+0

Hai mai trovato una soluzione per questo? – Jave

+0

@jave No Non ho esaminato ulteriormente questo aspetto, né ho avuto alcun feedback su nessun forum. Quindi la mia ipotesi è che non è implementato in Android OpenGL ES 2.0. Forse questo è stato risolto nelle versioni più recenti del sistema operativo? Ho provato questo utilizzando Android OS v2.3. –

+0

Ok, mi sono imbattuto personalmente in questo problema un paio di giorni fa, ma non ho trovato nemmeno una soluzione. (Utilizzando Android 2.2 tra l'altro). Se risolvi il problema, mi piacerebbe vedere come l'hai fatto. – Jave

risposta

1

stavo sperimentando sulla mia tavoletta Vega (Tegra) e questo ha funzionato per me:

frammento di shader:

#extension GL_NV_shader_framebuffer_fetch : require 
// makes gl_LastFragColor accessible 

precision highp float; 

varying vec2 v_texcoord; 

uniform sampler2D n_sampler; 

void main() 
{ 
    vec4 v_tex = texture2D(n_sampler, v_texcoord); 
    gl_FragColor = min(gl_LastFragColor, v_tex); // MIN blending 
} 

Abbastanza facile, eh? Ma temo che questo sarà solo NV.