OpenGL深度测试和混合不同步

OpenGL depth testing and blending not working simultaniously(OpenGL深度测试和混合不同步)
本文介绍了OpenGL深度测试和混合不同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在编写重力模拟,在使用OpenGL显示粒子时遇到一个小问题。

要获取圆形粒子,我创建了一个小的浮动数组,如下所示:

for (int n = 0; n < 16; n++)
            for (int m = 0; m < 16; m++)
            {
                AlphaData[n * 16 + m] = ((n - 8) * (n - 8) + (m - 8) * (m - 8) < 64);
            }
然后我将其放入格式为GL_RED的GL_TEXTURE_2D中。在片段着色器(通过glDrawArraysInstanced)中,我按如下方式绘制粒子:

color = vec4(ParticleColor.rgb, texture(Sampler, UV).r);

这可以正常工作,生成如下图片(放大的粒子用于演示):

如您所见,没有任何人工制品。这里的每个粒子都是相同大小的,所以您在较大的粒子上看到的每个较小的粒子都在背景中,应该看不到。当我使用

打开深度测试时
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

我得到如下内容:

因此,这在很大程度上看起来是正确的(&q;较小&q;粒子位于&q;较大&q;粒子后面)。但我现在有了底层四合院的文物。奇怪的是,并不是所有的粒子都有这种行为。

谁能告诉我,我做错了什么?还是深度测试和混合不能很好地配合?

我不确定您可能需要哪些其他代码来进行诊断(其他一切似乎都正常工作),所以如果您需要其他代码,请告诉我。

我在这里使用的是透视投影(当然是针对3D空间中的粒子)。

推荐答案

您处于特殊情况下,您的片段要么是完全不透明的,要么是完全透明的,因此可以同时进行深度测试和混合。实际问题是,对于深度测试,即使是完全透明的片段也会存储其深度值。可以通过显式丢弃着色器中的碎片来阻止写入。类似于:

color = vec4(ParticleColor.rgb, texture(Sampler, UV).r);
if (color.a == 0.0)
    discard;

注意,条件分支可能会带来一些额外开销,但我认为您的情况不会出现太多问题。

对于带有半透明碎片的一般情况,混合和深度测试同时不起作用。为了使混合产生正确的结果,您必须在渲染和从后到前渲染之前对几何体进行深度排序。

这篇关于OpenGL深度测试和混合不同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

error when trying to run an overloaded function with float parameters.(尝试运行带有浮点参数的重载函数时出错。)
C++ lt;lt; operator overloading without friend function(没有友元函数的C++lt;lt;运算符重载)
C++ - How does the compiler decide between overloaded functions with reference types as parameter?(C++-编译器如何决定使用引用类型作为参数的重载函数?)
How can I invoke an overloaded () operator on the keyword this?(如何对关键字this调用重载()运算符?)
How do I denote a pure virtual function in a UML class diagram?(如何在UML类图中表示纯虚函数?)
MPI parallel IO in ASCII format (How do I do it?)(ASCII格式的MPI并行IO(我该怎么做?))