这就是绘制多个精灵(纹理四边形)时的问题 前面的精灵,剪辑了后面的精灵,我将无法向用户显示它后面的内容。
我的预期输出是正确显示两个纹理,如下图左侧所示:(右侧不正确)
有什么建议如何解决这个问题吗?
这是我的代码:
绘图功能:
shader_begin(self->shader);
glEnable(GL_DEPTH_TEST);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthFunc(GL_LESS);
glBlendEquation(GL_ADD);
glDisable(GL_CULL_FACE);
glBindTexture(GL_TEXTURE_2D, tex_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
shader_end();
顶点着色器:
gl_Position = view_projection * world * vec4(point, 1);
如果您使用混合,则必须禁用深度测试。片段在混合之前会被深度测试丢弃,在深度测试期间未丢弃的片段将被混合。所以这取决于对象的绘制顺序。如果使用混合,则必须停用深度测试并从后到前绘制按深度排序的对象。这也意味着必须将网格划分为其基元,并且必须对基元进行排序,甚至必须分割基元。
另请参阅透明度排序、OpenGL 深度排序和OpenGL:透明纹理问题。
如果 alpha 值仅为 0 或 1,则另一种解决方案是根据片段的 alpha 值丢弃片段,而不是混合它们。禁用混合,但在
Fragment Shader中使用
discard
片段。例如:
void main() {
[...]
if (color.a < 0.5)
discard;
gl_FragColor = color;
}