gpt4 book ai didi

openGL:绘制多个立方体GL_CULL_FACE问题

转载 作者:行者123 更新时间:2023-12-03 09:16:33 26 4
gpt4 key购买 nike

我有 6 个立方体连接在一起,如下图所示:

before rotation

但是当我旋转它时。问题是后面的立方体没有被前面的立方体覆盖

after rotation

虽然我使用:

    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)

这是我的 onDrawFrame 重写函数:

    @Override
public void onDrawFrame(GL10 gl) {
// Clear color and depth buffers
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise
gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)
gl.glEnable(GL10.GL_TEXTURE_2D);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable texture-coords-array (NEW)



// ----- Render the Cube -----
update();
if (currentTransperent != newTransperent) {
cube.loadTexture(gl, context, newTransperent);
currentTransperent = newTransperent;
}
gl.glLoadIdentity(); // Reset the current model-view matrix
gl.glTranslatef(xPosition, yPosition, zPosition); // Translate into the screen
gl.glRotatef(angleCube, xAxis, yAxis, zAxis); // Rotate

gl.glPushMatrix();
gl.glRotatef(90.0f, 1, 0, 0);
gl.glTranslatef(0.0f, 0.0f, 1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glTranslatef(0.0f, 0.0f, -1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glRotatef(270.0f, 0, 1, 0);
gl.glTranslatef(0.0f, 0.0f, -1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glTranslatef(0.0f, 0.0f, 1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glRotatef(270.0f, 0, 1, 0);
gl.glTranslatef(0.0f, 0.0f, 1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glPushMatrix();
gl.glRotatef(90.0f, 1, 0, 0);
gl.glTranslatef(0.0f, 0.0f, -1.0f);
cube.draw(gl);
gl.glPopMatrix();

gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Disable texture-coords-array
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);

angleCube += rotateSpeed;
}

最佳答案

背面剔除不能保证正确的深度排序,除非整个场景由单个不透明的凹面对象组成。

如果您绘制单个立方体,背面剔除将保证仅绘制这些(最多 3 个)面向观察者的面。但是,当您绘制两个立方体时,GL 将按照您绘制它们的顺序渲染它们,并且如果没有其他方法,绘制第二个立方体将覆盖颜色缓冲区中先前的内容,即第一个立方体。事实上,它只会绘制第二个立方体的正面,而忽略其背面,这一事实不会改变出现在第一个立方体前面的第二个立方体的每个绘制面。

处理不透明对象可见性的标准方法是使用 Z buffer algorithm ,哪些 GPU 具有硬件支持,并且在 OpenGL 中可用 depth test .

关于openGL:绘制多个立方体GL_CULL_FACE问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37047806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com