OpenGL:透明纹理问题

时间:2017-08-30 07:41:25

标签: opengl transparency blending

我在OpenGL中遇到纹理透明问题。正如您在下面的图片中看到的那样,它并不常用。值得注意的是,黑色实际上是ClearColor,我用来清除屏幕。

enter image description here

我使用以下代码实现混合:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这是我的片段着色器:

#version 330 core

in vec2 tex_coords;

out vec4 color;

uniform vec4 spritecolor;
uniform sampler2D image;

void main(void)
{
    color = spritecolor * texture(image, tex_coords);
}

以下是线框模式中场景的屏幕截图,以防它有助于绘制顶点:

Scene in Wireframe mode

如果还需要其他任何东西,请随意提问,我会添加它。

1 个答案:

答案 0 :(得分:3)

您必须执行Transparency Sorting

如果绘制了一个场景,通常深度测试(glDepthFunc)设置为GL_LESS。这会导致片段仅在它们位于到目前为止的场景前面时被绘制。

要正确绘制transparents,您必须先绘制不透明对象。必须在之后绘制透明对象,按照与摄像机位置相反的距离进行排序。要正确绘制透明对象,必须先绘制不透明对象。必须在之后绘制透明对象,按照与摄像机位置相反的距离进行排序 首先绘制透明物体,它与相机位置的距离最大,最后绘制透明物体,距离相机位置的距离最短。

另见以下问题的答案: