我是电子工程师。我正在尝试设计(个人项目)3D图形硬件渲染器。它只能在此阶段渲染线框,没有填充,没有阴影,甚至没有背面剔除以及我们认为理所当然的其他任何东西。 Bresenham的整数画线算法。假设我已经在VHDL中实现了该算法,并且能够一一计算出所有像素值,那么如何将它们存储到帧缓冲区中?例如,我有100条线假设有10条线并并行计算其像素值,则较长的线将需要较长的时间来计算。每个时钟周期我都可以获取该行的下一个像素值,现在,如果我只是从内存中读取1个字节,用行像素数据覆盖它,然后将该字节写回,并为每一行的每个像素做一个字节读写方法似乎很麻烦且效率低下。因此,您知道如何计算出如何有效地将数据存储到帧缓冲区中,还是人们只是使用了非常快的内存而实际的方法又麻烦又低效?

评论

由于您不进行行的混合,因此您应该能够只写FB(而不是读写)。我相信那应该可以简化很多事情。

fb是什么意思?

framebuffer ......

听起来您说的是您从帧缓冲区读取了一个1字节的值,并且那部分很慢/很麻烦?如果是这样,为什么要从帧缓冲区读取而不是“盲写”?如果这样的话。如果发生了这种情况,则在进行alpha混合时,在真实的GPU中也会发生类似的情况。 Alpha混合需要读取已经存在的像素值才能与新的像素值混合,因此它比非Alpha写入(仅写入而不读取)要慢。

#1 楼

像CPU这样的真实GPU具有缓存层次结构。因此,光栅化器不会直接存储到内存中,而是存储到最终会刷新到内存的缓存中。

栅格化通常会具有一定的空间局部性(它将在时间上靠近的附近像素中生成写入),因此,如果这些像素在同一缓存行中,则会减少内存事务的总数。这对于填充的多边形栅格化比对线更有效,但是即使线也具有一定的局部性(尤其是如果一次对附近的多条线进行栅格化)。而不是线性地从左到右和从上到下。您将选择一个图块大小(例如4×4或8×8),并将每个图块中的像素存储在一个连续的内存块中,然后使用图块数组制作整个帧缓冲区。这使您在两个维度上都具有局域性,而不仅仅是一个维度,从而提高了缓存性能。而且,平铺很容易在硬件中完成,因为归结为只是模糊一些X和Y地址位的顺序。

评论


$ \ begingroup $
FPGA的内部存储器很少。我将考虑您的描述。
$ \ endgroup $
– Quantum231
16年11月8日在8:46