0

我正在创建一个具有两层的圆形球体:
一层具有上面的浅色层(半径 300)
,一层具有较深的颜色层(半径 298)

当我在窗口上绘制这个球体时,我得到了正确绘制的球体。

以下代码不完全正确openGL,但openGL人们理解它不会有任何问题

ofImage 球形图像;GLUquadricObj *quadric;

ofPushMatrix();

    //Sphere dark image
    ofRotateX(90);
    ofPushStyle();
    ofSetColor(43,64,105);
    sphericalImage.getTextureReference().bind();
    gluSphere(quadric, 298, 100, 100);
    ofPopStyle();

    //Sphere light image
    ofPushStyle();
    ofSetColor(255,255,255);
    sphericalImage.getTextureReference().bind();
    gluSphere(quadric, 300, 100, 100);
    ofPopStyle();
    sphericalImage.unbind();

流行矩阵();

然而,问题在于某些部分,前图像(较浅的图像)实际上覆盖/覆盖了后球形图像(并且较暗的部分不完全可见)。当用相机旋转球体时,有时该区域会根据旋转角度/轴变得可见。我想禁用它,这样就不会发生这种效果。

我早些时候在想这是否与 openGL 中的 face-cullin 有关,但我通过设置禁用了glDisable(GL_CULL_FACE)它并且它没有任何效果。glEnable(GL_DEPTH_TEST);也设置了。关于如何禁用它以使两个球形图像都可见的任何建议?

4

1 回答 1

4

您的问题是,半透明表面的混合与深度顺序无关。启用混合后,您必须从远到近对脸部进行排序才能完成此工作。深度缓冲区不会帮助你。

幸运的是,如果您的形状是凸形,则可以通过绘制每个凸形 2 次来完成排序。一次剔除正面(这会绘制远处的背面),然后剔除背面(仅绘制近处的正面)。如果您以类似 matroshka 的方式排列几何图形,您首先在外面向内工作,正面被剔除,然后再向外工作,背面被剔除。

修改你的代码它看起来像这样

glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);

//Globe light image
ofPushStyle();
ofSetColor(255,255,255);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 300, 100, 100);
ofPopStyle();
sphericalImage.unbind(); 

//Sphere dark image
ofRotateX(90);
ofPushStyle();
ofSetColor(43,64,105);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 298, 100, 100);

glCullFace(GL_BACK);

gluSphere(quadric, 298, 100, 100);
ofPopStyle();

//Globe light image
ofPushStyle();
ofSetColor(255,255,255);
sphericalImage.getTextureReference().bind();
gluSphere(quadric, 300, 100, 100);
ofPopStyle();
sphericalImage.unbind();
于 2012-12-31T08:46:12.927 回答