如何以与 OpenGL 中的点精灵相同的方式渲染屏幕对齐的矩形
Posted
技术标签:
【中文标题】如何以与 OpenGL 中的点精灵相同的方式渲染屏幕对齐的矩形【英文标题】:How to render screen aligned rectangles the same way as point-sprites in OpenGL 【发布时间】:2014-10-22 15:12:30 【问题描述】:我想渲染与屏幕轴对齐的矩形,但不使用任何花哨的东西,例如三角形或扇形... 我在网上搜索,但只找到了使用三角形的示例......(最终一个使用剪刀矩形,但如果我渲染其中的许多会太慢,尤其是在旧版本上)
我知道三角形是现代硬件最擅长渲染的东西,但我不明白它怎么能比做一些事情(理论上)更快:
for (i=y; i<y+h; i++)
for (j=x; j<x+w; j++)
executeFragmentShader(j, i);
//x, y, w and h being the rectangle's data
我在问 OpenGL 中是否有一种方法可以像使用 gl_PointSize 一样指定一个顶点和尺寸来渲染像点精灵一样的矩形。
在不可能的情况下,互联网浏览器或其他桌面应用等视频加速软件如何渲染矩形区域? 他们使用三角形吗?
【问题讨论】:
如果你使用几何着色器,你可以从一个顶点发射两个三角形。但是,我必须强调,在这种情况下,几何着色器永远不会真正提高性能。通过绘制 4 个索引顶点并将它们放在顶点着色器中,您将获得更好的性能。 【参考方案1】:他们使用三角形,排列如下:
如果您不关心深度缓冲区的值,那么您可以通过不在顶点着色器中进行任何转换来渲染四边形(或者,如果使用旧的glMatrix
函数,则使用恒等投影和模型视图矩阵); (-1, -1)
将是屏幕的左下角,而(1,1)
将是右上角。或者,您可以使用正交投影矩阵来传递像素坐标或其他东西。
如果您需要深度值,或者需要使用世界空间坐标,请查看广告牌;有很多关于如何做到这一点的教程。
请记住,现代 3D 游戏每帧绘制数十万个投影三角形,但只有少数 HUD 元素,这些元素几乎总是简单的带纹理的矩形。猜猜 GPU 供应商针对哪种情况进行了优化。
【讨论】:
首先,感谢您的回答,但我相信(如果我错了,请告诉我)渲染一个点精灵比渲染两个三角形(必须光栅化)更快。那么,对于对齐并面向屏幕的矩形也应该可以实现同样的效果,对吧?那么这是每个程序员的错误(不太可能)还是在 OpenGL 中根本不可能(有点令人失望)? 你的回答让我有点困惑。您是否声称点精灵被渲染为两个三角形?这不是 GL 规范所涵盖的内容 - 当然可以将别名点精灵渲染为两个三角形而不会违反任何内容,但这不是唯一的方法。另一方面,抗锯齿点精灵以完全不同的方式光栅化(如圆圈)。 @Lewin 点只能渲染为正方形,但您可以使用带有discard
的片段着色器来伪造非正方形矩形。否则,两个三角形的方法是形成矩形的唯一方法。点可能更快,但除非您要渲染数千个对象,否则差异很可能可以忽略不计。
@AndonM.Coleman 很抱歉让您感到困惑。第一句是对问题中最后两句的回应;我的回答根本没有引用点精灵。以上是关于如何以与 OpenGL 中的点精灵相同的方式渲染屏幕对齐的矩形的主要内容,如果未能解决你的问题,请参考以下文章
如何以与 np.where 相同的方式使用 Tensorflow.where?