我是个电子工程师。我试图设计一个三维图形硬件渲染器(个人项目)。它只会渲染线框在这个阶段,没有填充和阴影,甚至没有背面裁剪和其他任何我们认为理所当然。
据我所知,在屏幕上绘制线的最有效的方法是通过Bresenham的整数直线绘制算法。如果我已经用VHDL实现了该算法,并且能够一个一个地计算出所有像素值,那么如何将它们存储到帧缓冲区中呢?
例如,我有100条线,我可以用10条线并行计算它们的像素值,更长的线需要更长的时间来计算。每一个时钟周期我都能得到行的下一个像素值,现在,如果我从内存中读取1字节,用行像素数据覆盖它,并将该字节写回,并且对每一行的每个像素都这样做,那么1字节的读写方法看起来非常繁琐和效率低下。那么,您知道如何高效地将数据存储到帧缓冲区中吗?还是人们只是使用非常快的内存,但实际的方法却是繁琐和低效的?
发布于 2016-11-08 04:25:58
真正的GPU,像CPU一样,有一个缓存层次结构。因此,光栅器不会直接存储到内存中,而是存储到缓存中,最终会被刷新到内存中。
栅格化通常具有一定的空间局部性(它会在时间上生成对附近像素的写入),因此,如果这些像素位于相同的缓存线上,则会减少内存事务的总数。这对填充多边形的栅格化比对线条更有效,但即使是线条也有一定的局部性(尤其是当多条相邻的线同时被栅格化时)。
另一个窍门是以平铺格式存储框架缓冲区,而不是从左到右和从上到下线性存储。您可以选择一个瓷砖大小,如4×4或8×8,并将每个块中的像素存储在一个连续的内存块中,然后将整个帧缓冲区从一个瓷砖数组中提取出来。这给了您两个维度(而不仅仅是一个维度)的局部性,从而提高了缓存性能。平铺在硬件上很容易完成,因为它只需要调整一些X和Y地址位的顺序。
https://computergraphics.stackexchange.com/questions/4239
复制相似问题