【发布时间】:2016-08-03 13:17:16
【问题描述】:
我遇到了光栅化的描述,它基本上说当一个对象被投影到屏幕上时,会发生扫描窗口/屏幕上的所有像素并决定像素/片段是否在三角形,因此确定像素/片段在三角形内部,然后对像素/片段进行进一步处理,例如着色等
现在因为我正在研究 OpenGL,而且我知道 OpenGL 可能有它自己的这个过程的实现,所以我想知道这是否也发生在 OpenGL 中,因为我在 OpenGL 中阅读了顶点的“扫描转换”过程教程
现在与此相关的另一个问题是我知道像素的图像/屏幕/窗口是图像或像素的二维数组,也称为线性默认帧缓冲区
所以我想知道的是,如果是这样的话,投影三角形的 3 个顶点如何定义它的侧面覆盖了哪些像素?
光栅化器是否首先绘制三角形的边缘,然后扫描每个像素或二维像素数组(也称为默认帧缓冲区),并使用某种数学方法或其他更简单的过程查看这些点是否位于线条之间发生了什么?
【问题讨论】:
-
不,它不会先绘制边缘。这会使相邻的三角形重叠一个像素,这会给半透明的三角形带来麻烦。此外,它会很慢。它做了什么它可能会扫描包围三角形的最小矩形,并使用三个叉积(或者可能是点积)来查看像素是否在该三角形内部。
-
我想这样的事情会起作用:
bool inside(ivec2 a, ivec2 b, ivec2 c, ivec2 p) {return cross(p-a,b-a)>0 && cross(p-b,c-b)>0 && cross(p-c,a-c);}. -
如果它使用线性插值来确定边缘上的点怎么办?然后使用这些点从三角形的一个边缘扫描到另一侧?这似乎是一种可能性?
-
@gettingfaster:OpenGL 没有详细说明如何进行三角形的扫描转换。无论是先做边缘还是扫描线或其他什么,这都取决于实现。 OpenGL 确实指定了有关结果的某些内容(连接性保证等),但对于您所谈论的内容,规范并没有说明。
-
@gettingfaster:你链接的这些算法,它们不是 GPU 的工作方式。您对 GPU 如何实现光栅转换有错误的想法。没有某种程序正在执行;整个光栅化以一种非常平行的、无序的、纯硬连线的方式发生。此外,内存在 GPU 中也不是线性组织的。数据结构和布局与您在 GPU 上看到的完全不同。内存不是通过平铺坐标的线性地址来寻址的。
标签: c++ opengl rasterizing