2017-08-30 245 views
1

我在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

回答

3

你必須做一個Transparency Sorting

如果場景繪製,通常深度測試(glDepthFunc)設置爲GL_LESS。這會導致只有當它們位於到目前爲止繪製的場景的前面時纔會繪製片段。

要正確繪製透明體,必須先繪製不透明物體。必須繪製透明物體,按相機位置的相反距離排序。要正確繪製透明物體,必須先繪製不透明物體。透明對象必須在後面繪製,按相機位置的相反距離排序。
先繪製透明物體,它距離相機位置最遠,最後繪製透明物體,距離相機位置最近。

又見回答以下問題: