所有多边形都变得透明,如何修复?

Posted

技术标签:

【中文标题】所有多边形都变得透明,如何修复?【英文标题】:All polygons become transparent, how to fix? 【发布时间】:2019-05-06 17:42:25 【问题描述】:

我在我的项目中做了一些事情,所有的多边形都变得透明了。

我下载了我的旧 git,一切正常,但仍然透明。

勾选事件: 在渲染所有多边形图纸

    public void render()  
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
       glClearColor(0.925f, 0.98f, 0.988f, 1f);

       glPushMatrix();

       game.render();

       glPopMatrix();
   

最后更改的函数:

public void drawModel(Vector3f camLocation) 

        for (int i = 0; i < count; i++) 

            glPushMatrix();
            glTranslated(copies[i].x, copies[i].y, copies[i].z);
            glRotatef(rotations[i], 0, 1, 0);

            texture.bind();
            glEnable(GL_TEXTURE_2D);
            glBegin(GL_TRIANGLES);

            if (Stereometry.getVectorLenght(camLocation, copies[i]) < lodRange) 
                k = 0;
             else 
                k = m.length - 1;
            
            for (Model.Face face : m[k].getFaces()) 

                //Первая точка
                Vector3f n1 = m[k].getNormals().get(face.getNormalIndices()[0] - 1);
                glNormal3f(n1.x, n1.y, n1.z);
                if (m[k].hasTextureCoordinates() && hasText) 
                    Vector2f t1 = m[k].getTextureCoordinates().get(face.getTextureCoordinateIndices()[0] - 1);
                    glTexCoord2f(t1.x, t1.y);
                
                Vector3f v1 = m[k].getVertices().get(face.getVertexIndices()[0] - 1);
                glVertex3f(v1.x * scale, v1.y * scale, v1.z * scale);

...2 More Vertex...

            glEnd();
            glDisable(GL_TEXTURE_2D);
            glRotatef(-rotations[i], 0, 1, 0);
            glTranslated(-copies[i].x, -copies[i].y, -copies[i].z);
        

    

外观:https://yadi.sk/i/D7XQhyBICB6sug

【问题讨论】:

我已经启用了这个,但它没有帮助。我还启用了GL_BLEND。如果我删除glEnable(GL_BLEND);,它将正常工作,但我需要使用 alpha chanels。 在绘制纹理网格之前明确设置glColor3f(1, 1, 1); 我找到了工作的 git。要打破我的多边形,我只需要删除drawModel() 中的glPushMatrix();。启动应用程序。放回glPushMatrix();,它总是透明的,我只能通过下载 git 来修复。 【参考方案1】:

如果启用纹理,则默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为GL_MODULATE。见glTexEnv

这会导致纹理纹理像素的颜色和 Alpha 通道被glColor4f 设置的最后一种颜色“混合”。

在渲染纹理之前设置“白色”颜色和 alpha 通道 1,以解决您的问题:

glColor4f(1, 1, 1, 1);

注意,如果当前颜色的 alpha 通道低于 1 并且启用了Blending,这可能会导致意外的透明效果。

另一种解决方案是将环境模式更改为GL_REPLACE,而不是:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

【讨论】:

以上是关于所有多边形都变得透明,如何修复?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV:如何混合多个不同颜色的半透明多边形?

如何绘制透明多边形?

在地图图块上绘制空间多边形时如何调整透明度?

透明天空盒+透明高度图的OpenGL混合问题

如何裁剪多边形外的区域?

在 Flutter 中设置谷歌地图多边形的不透明度颜色