2014-06-22 122 views
0

我試圖在我的Android設備上獲取深度緩衝區(nexus 7)。 因爲我無法附加深度緩衝區(opengl ES),所以我嘗試使用着色器來對顏色緩衝區的G和B分量中的深度值進行編碼。 着色器:深度圖像上的點

static const char gVertexShader[] = 
"varying vec2 texcoord;            \n" 
"void main()              \n" 
"{                 \n" 
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;  \n" 
" texcoord = gl_MultiTexCoord0.xy/gl_MultiTexCoord0.w;  \n" 
"}                 \n"; 

static const char gFragmentShader[] = 
#ifdef __ANDROID__ 
"precision highp float;          \n" 
#endif 
"uniform sampler2D modelTexture;        \n" 
"varying vec2 texcoord;          \n" 
"void main()             \n" 
"{               \n" 
" gl_FragColor.r = texture2D(modelTexture, texcoord).r;  \n" 
" float depth = gl_FragCoord.z;        \n" 
" gl_FragColor.g = depth;         \n" 
" gl_FragColor.b = depth;         \n" 
" gl_FragColor.a = 1.0;         \n" 
"}               \n"; 

在PC上,結果是OK(它應該是城市建築面,相同的深度各)圖像是G通道: pc

但在Android,這個結果上有 「點」,意思接近像素的紋理: Android

Android的配置是:

EGL_BUFFER_SIZE: 32 
EGL_ALPHA_SIZE: 8 
EGL_BLUE_SIZE: 8 
EGL_GREEN_SIZE: 8 
EGL_RED_SIZE: 8 
EGL_DEPTH_SIZE: 16 
EGL_STENCIL_SIZE: 0 
EGL_CONFIG_CAVEAT: 12344 
EGL_CONFIG_ID: 25 
EGL_LEVEL: 0 
EGL_MAX_PBUFFER_HEIGHT: 2048 
EGL_MAX_PBUFFER_PIXELS: 4194304 
EGL_MAX_PBUFFER_WIDTH: 2048 
EGL_NATIVE_RENDERABLE: 0 
EGL_NATIVE_VISUAL_ID: 1 
EGL_NATIVE_VISUAL_TYPE: -1 
EGL_SAMPLES: 0 
EGL_SAMPLE_BUFFERS: 0 
EGL_SURFACE_TYPE: 3175 
EGL_TRANSPARENT_TYPE: 12344 
EGL_TRANSPARENT_RED_VALUE: 0 
EGL_TRANSPARENT_GREEN_VALUE: 0 
EGL_TRANSPARENT_BLUE_VALUE: 0 
EGL_BIND_TO_TEXTURE_RGB: 0 
EGL_BIND_TO_TEXTURE_RGBA: 0 
EGL_MIN_SWAP_INTERVAL: 1 
EGL_MAX_SWAP_INTERVAL: 1 
EGL_LUMINANCE_SIZE: 0 
EGL_ALPHA_MASK_SIZE: 8 
EGL_COLOR_BUFFER_TYPE: 12430 
EGL_RENDERABLE_TYPE: 4 
EGL_CONFORMANT: 4 

這可能是什麼原因造成的? 是否有另一種方式來讀取Android設備上的深度緩衝區?

回答

1

嘗試禁用抖動:

GLES20.glDisable(GLES20.GL_DITHER); 
+0

我沒想到的是抖動會影響深度地圖... TNX。 – eranb