2013-07-08 91 views
0

編輯:事實證明這是正確的,希望它仍然可以幫助其他人解決類似問題。OpenGL ES 2.0對象在啓用深度測試時消失

在OpenGL ES 2.0(使用EGL)中設置深度測試流水線時是否存在缺失的部分?

我發現這個很多問題,但所有被要麼解決正確設置上下文初始化的深度緩衝

EGLint egl_attributes[] = { 
     ... 
     EGL_DEPTH_SIZE, 16, 
     ... 
     EGL_NONE }; 

if (!eglChooseConfig(
     m_eglDisplay, egl_attributes, &m_eglConfig, 1, &numConfigs)) { 
    cerr << "Failed to set EGL configuration" << endl; 
    return EGL_FALSE; 
} 

或通過適當啓用和清除深度緩存,並經過這樣做上下文已被初始化:

// Set the viewport 
glViewport(0, 0, m_display->width(), m_display->height()); 

// Enable culling and depth testing 
glEnable(GL_CULL_FACE); 
glDepthFunc(GL_LEQUAL); 
glEnable(GL_DEPTH_TEST); 

// Clear the color and depth buffers 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
glClearDepthf(1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// Draw elements 
m_Program->drawAll(); 

註釋掉glEnable(GL_DEPTH_TEST)我有一個場景,但沒有深度測試閉塞我很想有。

在着色器,輸出的gl_Position視覺作品如預期的那樣z組分(z值在範圍[0,1]):

// Vertex Shader 
uniform mat4 u_matrix; 
attribute vec4 a_position; 
varying float v_depth; 
void main() { 
    vec4 v_position = u_matrix * a_position; 
    v_depth = v_position.z/v_position.w; 
    gl_Position = v_position; 
} 

// Fragment shader 
varying float v_depth; 
void main() { 
    gl_FragColor = vec4((v_depth < 0.0) ? 1.0 : 0.0, 
         v_depth, 
         (v_depth > 1.0) ? 1.0 : 0.0, 
         1.0); 
} 

所有對象都是純綠色的陰影,顏色較深爲如預期的那樣,更接近和更加光明。可悲的是,一些更近(更亮)的對象被繪製在更近(更深的)對象上。

任何想法我失蹤? (如果沒有別的,我希望這會總結其他人已經有的問題)。

回答

0

看來我並沒有錯過任何東西。我有一個流氓多邊形(在不同的着色器程序中),當深度被啓用時會遮擋一切。以上是一個正確的設置。

+0

它不會讓我再次「2天」 – quornian