从一个角度看,我的灌木是这样的:

从另一个角度看,它们看起来是这样的:

我的理论是,从第一个角度看灌木,灌木后面的所有块都已经画好了,所以当要画灌木的时候,它只是把它们画在上面。
然而,从另一个角度来看,它基本上是先画灌木,然后当它在灌木后面画块时,它检查深度缓冲器,发现有什么东西已经挡住了树丛的视野,所以它不会渲染它,导致蓝色方块(我的清晰颜色)。
不过,我真的不知道如何解决这个问题。禁用深度测试会导致其他各种错误。是否有办法将顶点或多边形标记为具有透明度,以使其知道仍然需要渲染后面的内容?
Found this。这是唯一的解决办法吗?将我的透明和不透明块分开,然后在CPU上手动对它们进行排序--几乎每个帧都是这样,因为播放器可以移动吗?一定有办法把这个委托给GPU..。
发布于 2012-02-19 21:32:35
该链接(以及CPU上的排序)用于alpha混合。如果您只需要Alpha测试(而不是混合测试),那么您就不需要对任何东西进行排序。只要启用alpha测试,保持深度测试启用,一切都会变得很好。
参见这里:http://www.opengl.org/wiki/Transparency_Sorting您需要需要alpha测试的"Alpha测试“,而不是需要排序的”标准半透明“。
发布于 2012-02-19 21:58:18
解决方案1:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)对象(烟雾/玻璃/草):呈现透明场景,从最多边形到最近的多边形,深度缓冲区写入禁用(glDepthMask(GL_FALSE))。如果所有透明对象都是凸的且不相交,则可以对对象进行排序,而不是polygons.glBlendFunc(GL_SRC_ALPHA, GL_ONE)和glBlend(GL_ONE, GL_ONE) (火、“魔术”粒子系统、辉光):按照禁用深度缓冲区写入(glDepthMask(GL_FALSE))的任何顺序呈现透明场景。之后不呈现任何启用深度缓冲区的对象。
解决方案2:
使用深度剥离(google it)。尤其是如果透明的对象彼此相交。不适合粒子系统和草,这需要解决方案#1。
,然后在CPU上手动对它们进行排序,几乎每一个帧都是这样。
插入排序对于已经排序或部分排序的数据非常有用。
必须有办法把这个委托给GPU.
我认为你可以生成草多边形(正确的顺序)在几何着色使用纹理,有一个通道(例如,阿尔法),标记区域有和没有草。需要OpenGL 4,您可能需要对多边形执行某种更高级别的排序,您将提供给着色器生成草块。
单个灌木可以旋转在顶点着色器( +- 90/180/270度),以保持正确的多边形排序,如果他们是完全对称的所有方向。
还有一种合并排序算法,它可以很好地并行化,可以在GPU上执行,可以使用GDGPU方法或OpenCL/CUDA。
然而,使用类似的东西,使5灌木草大致相当于试图杀死一只蟑螂与手榴弹发射器-有趣的事情,但不是完全有效的。
我建议您忘记“将其卸载到GPU”,直到您实际遇到性能问题。使用分析器并始终在优化之前进行度量,否则会浪费大量的开发时间进行不必要的优化。
发布于 2013-12-22 19:07:23
如果您使用的是WebGL或OpenGL ES 2.0 (iPhone/Android),则不存在alpha测试。相反,您不需要绘制透明像素。这样,它们不会影响深度缓冲区,因为没有写入像素。为此,您需要丢弃片段着色器中透明的像素。你可以硬编码
...
void main() {
vec4 color = texture2D(u_someSampler, v_someUVs);
if (color.a == 0.0) {
discard;
}
gl_FragColor = color;
}或者您可以模拟旧风格的alpha测试,您可以在其中设置alpha值。
...
uniform float u_alphaTest;
void main() {
vec4 color = texture2D(u_someSampler, v_someUVs);
if (color.a < u_alphaTest) {
discard;
}
gl_FragColor = color;
}https://stackoverflow.com/questions/9353210
复制相似问题