OpenGL透明立方体缺少边

mftmpeh8  于 2022-10-18  发布在  其他
关注(0)|答案(2)|浏览(310)

在OpenGL中,我在正交投影中画了一个透明的立方体,环境有一个前缘。结果如图所示。我不明白的是,为什么会有缺失的边缘?

gl.Enable(OpenGL.GL_BLEND);
gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);

我使用了一个使用索引的DrawElements()函数。
有什么建议吗?

aamkag61

aamkag611#

这是由深度测试引起的。OpenGL一次渲染一个三角形(或正方形)。启用深度测试时,如果已在像素前面渲染了某个像素,则会跳过该像素的渲染。这对实体对象很好,但对透明对象不起作用,因为必须首先渲染背面部分,否则它们根本不会被渲染。
实现透明度的方法有很多,但没有一种特别好。不幸的是,无论你用哪种方式切片,透明的物体都不像不透明的物体那样容易渲染。
下面是一些让事物变得透明的方法:

  • 对面进行排序,并从后到前进行渲染。
  • 对面进行排序并从前到后渲染,使背面不可见。
  • 使用面剔除和渲染两次:剔除正面并渲染,然后剔除背面并渲染。通过让OpenGL为您执行此操作,可以产生与自后而前相同的效果。仅适用于凸形对象(立方体是凸形的),如果您有多个透明对象,则仍需对这些对象进行排序。
  • 使用面部剔除来剔除背面。通过让OpenGL为您进行渲染,这可以产生与从后到前渲染相同的效果。与前一条相同的警告。
  • 使用不同的混合模式,在渲染顺序不重要的情况下,例如乘法或加法,并关闭深度测试。乘性混合模式移除光线而不添加光线-看起来像玻璃纸而不是彩色玻璃-你需要白色背景。加法混合模式看起来就像其中一个科幻宇宙飞船控制屏幕-它自己发光,你也可以透过它看到东西。
  • 深度剥离和链接列表缓冲区是对每个像素进行单独排序的两种技术,但它们需要更密集的处理和非常复杂的着色器。
  • 光线跟踪(够了)
  • 如果所有的脸都是相同的颜色,你只需关闭深度测试,它就会看起来不错。因为这些面都是一样的,所以你看不出它们是以错误的顺序渲染的。这适用于你的红色立方体,但如果你添加不同的颜色或纹理,它就不会起作用。
  • 要正确地渲染具有半透明内部的立方体,而不仅仅是半透明的表面,你需要一个体积半透明效果,这在这里也更加复杂和超出范围。您将渲染背面和正面,并根据它们之间的距离应用不同数量的半透明。
vwoqyblh

vwoqyblh2#

我将其解析为用户253751,并将其归结为指令:

gl.Enable(OpenGL.GL_DEPTH_TEST);
gl.DepthFunc(OpenGL.GL_ALWAYS);

相关问题