第一次来这里。今天坐下来自学OpenGL。但我遇到了一个我似乎找不到答案的问题。我想知道为什么深度测试似乎与OpenGL中的半透明对象不兼容。文档似乎建议您必须关闭深度测试,然后以反向距离顺序绘制对象,然后混合将正常工作。
但为什么openGL不能像往常一样使用相同的深度测试来找出反距离顺序中最远的位置,并为您执行此操作?这只是一个框架的限制,还是与您在图形硬件中可以有效地做什么有关,或者类似的事情?
只是想知道。希望这里有人能解释清楚。
发布于 2009-06-27 02:39:05
问得好。
简而言之,Z缓冲区为帧缓冲区中的每个像素存储单个值(仅限)。给定“通常”操作模式(对于不透明对象--启用GL_DEPTH_TEST,将glDepthFunc设置为GL_LESS),该值将是映射到该像素的最近片段的深度。
帧缓冲区是一个“哑巴”设备--每个片段都独立于所有其他片段进行光栅化和深度测试,并与生成它的原语的任何概念分离。因此,没有地方来保存关于前述基元、深度排序等的信息,这是实现“自动透明”功能所必需的。
你可能想在“场景图”中寻找深度排序的帮助。这些库在OpenGL提供的基本T&L内容之外添加了“更高级别”的功能。
希望这能有所帮助。
发布于 2009-06-27 03:18:33
OpenGL一次向深度缓冲区写入一个像素,并按照呈现给OpenGL的顺序渲染生成像素的三角形。OpenGL不会对三角形进行任何深度排序,而是由调用框架以对该应用程序最有效的方式进行管理。这是为了提高速度和灵活性,因为渲染大量三角形的最有效方法是将它们存储在顶点和索引的连续缓冲区中,如果API必须担心每一帧都要对它们进行排序,这将使事情变得慢得多。
此外,材质并不直接与API中的三角形关联,因此在实际渲染之前,OpenGL实际上无法知道哪些是透明的,哪些是不透明的。
处理它的一个好方法是首先绘制所有不透明的三角形,然后最后绘制所有的透明/alpha混合三角形。您通常希望启用深度测试,但禁用深度写入,并按从后到前的顺序对透明三角形进行排序,以便正确混合。我通常的处理方式是有一个带有许多桶的场景图,当我在场景图中添加三角形时,它会自动将它们分离到适当的桶中,这些桶将以正确的顺序呈现。
发布于 2009-06-27 02:43:21
我还没有听说过关闭深度测试。您需要对透明对象进行深度测试。
你只是不想让透明的对象写入z-buffer,因为那样它们就会在它们后面的任何东西上打洞,然后再绘制出来。
https://stackoverflow.com/questions/1051971
复制相似问题