編集:これは正しいことが判明しました。うまくいけば、同様の問題を抱えている他の人に役立つことを願っています。
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)
I have a scene but without the depth test occlusion をコメントアウトします。
シェーダーでは、z
コンポーネントのgl_Position
視覚的な出力が期待どおりに機能します (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);
}
予想どおり、すべてのオブジェクトは純粋な緑の色合いで、近くにあるほど暗く、遠くにあるほど明るくなります。悲しいことに、より近い (より暗い) オブジェクトの上に、さらに (より明るい) オブジェクトが描画されます。
私が見逃しているアイデアはありますか?(他に何もないとしても、これが他の人が抱えているいくつかの問題を要約していることを願っています)。