OpenGL:透明纹理问题

问题描述:

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

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

如果需要其他东西,随时问,我会添加它。

+0

你必须先绘制不透明的物体。透明对象必须在后面绘制,按相机位置的相反距离排序。 (考虑深度测试) – Rabbid76

+0

是的,它做到了!您能否将您的评论添加为答案,以便我可以接受它? – AProgrammer

你必须做一个Transparency Sorting

如果场景绘制,通常深度测试(glDepthFunc)设置为GL_LESS。这会导致只有当它们位于到目前为止绘制的场景的前面时才会绘制片段。

要正确绘制透明体,必须先绘制不透明物体。必须绘制透明物体,按相机位置的相反距离排序。要正确绘制透明物体,必须先绘制不透明物体。透明对象必须在后面绘制,按相机位置的相反距离排序。
先绘制透明物体,它距离相机位置最远,最后绘制透明物体,距离相机位置最近。

又见回答以下问题: