You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenGL中三角形顶点画线的渲染行为、深度测试及线宽问题咨询

OpenGL相关问题解答

问题1:在三角形顶点的精确坐标上绘制一条线,其渲染行为是怎样的?

这得结合深度测试设置光栅化规则来看:

  • 首先,如果你的线的端点和三角形顶点的坐标经过MVP变换后,深度值完全一致,且开启了GL_LEQUAL这类允许深度相等时通过测试的模式,那么线的像素会和三角形覆盖的像素进行正常的深度竞争:
    • 如果三角形先绘制,深度缓冲里已经写入了三角形顶点区域的深度值,后续绘制的线的对应像素深度等于缓冲值,会通过测试,最终线的像素会覆盖三角形的对应区域(如果没开启混合的话);
    • 如果线先绘制,后续三角形的像素也会因为深度相等通过测试,覆盖线的对应区域。
  • 从光栅化角度来说,OpenGL的线和三角形的像素覆盖逻辑不同:线是基于像素中心的覆盖判断,三角形是基于区域覆盖。但当顶点完全重合时,两者会共享部分像素,这时候最终显示结果就完全由绘制顺序和深度测试/混合的设置决定了。如果开启了MSAA,覆盖计算会更精细,但核心逻辑还是一致的。

问题2:关于几何着色器生成的三角形上叠加宽线的两个疑问

2.1 OpenGL是否能保证GL_LEQUAL深度测试生效?

当然能,只要你的线条顶点坐标经过变换后,和几何着色器输出的三角形顶点的深度值完全一致,GL_LEQUAL深度测试就会正常工作。

OpenGL的深度测试是针对每个片段(像素)生效的,不管这个片段来自几何着色器生成的三角形图元,还是你用glDrawArrays(GL_LINES, 0, 6)绘制的线图元。只要线条的顶点和三角形顶点的变换后坐标(包括深度)完全匹配,当你开启深度测试后,线的每个片段都会和深度缓冲里的三角形片段深度做比较,符合GL_LEQUAL条件的片段就会通过测试,显示出来。

唯一需要注意的是:如果几何着色器对三角形顶点做了额外的变换(比如偏移、修改Z值),那你绘制线条时必须用几何着色器输出后的顶点坐标,否则两者深度值不匹配,深度测试的结果就会不符合预期。

2.2 设置glLineWidth(10)后的表现是怎样的?

不会像禁用深度测试那样渲染整条线,也不会变成半圆柱体,原生宽线的渲染逻辑是这样的:

OpenGL会把宽线光栅化为平行于原始线的矩形条带,条带的每个片段的深度值,是对应原始线在该位置的深度值(沿着线的方向深度会插值,垂直于线的方向深度和线的该点深度一致)。

这意味着开启深度测试时,宽线的每个片段都会单独进行深度测试:如果宽线的某部分在三角形前面(深度值更小),这部分会正常显示;如果某部分在三角形后面(深度值更大),就会被三角形遮挡,不会显示出来。

原生的宽线没有曲面效果,它就是平面的矩形条,只有当你自己用几何着色器把线转换成带弧度的四边形/三角形网格时,才能模拟出半圆柱体的效果。


内容的提问来源于stack exchange,提问作者Powereleven

火山引擎 最新活动