OpenGL像素精确光栅化不同的拱门

时间:2012-04-19 15:46:43

标签: opengl rasterizing mesa

对于我正在开发的应用程序,我需要能够

  • 绘制不同宽度和颜色的线条
  • 绘制纯色填充三角形
  • 绘制纹理(无alpha)四边形

非常容易......但是......

所有坐标在像素空间中都是整数,非常重要:glReading帧缓冲区中的所有像素 在两台不同的机器上,使用两个不同的图形卡,运行两个不同的操作系统(Linux和freebsd), 必须产生完全相同的位序列(给定适当的恒定格式转换)。

我认为使用opengl和硬件加速是不可能安全地实现的,因为我打赌不同的图形 卡(来自不同供应商)可以实现不同的光栅化算法。 (OpenGl规范很清楚这一点,因为他们提出了一种算法,但他们也说明实现可能会有所不同 在某些情况下)。 此外,我并不需要硬件加速,因为我将渲染非常低的速度和简单的图形。

您认为我可以通过禁用硬件加速来实现这一目标吗?在linux下的情况会发生什么,我会默认 MESA软件光栅化器?在这种情况下,我能确定它会一直有效还是我遗失了什么?

1 个答案:

答案 0 :(得分:3)

你正在回读渲染像素并且强烈依赖于他们的数学精确度/再现性听起来像一个设计缺陷。这个动作的目的是什么?例如,如果您需要从图像中提取一些信息,为什么不尝试在渲染之前从抽象的矢量化信息中提取这些信息?

无论如何,如果你依赖外部渲染代码并且无法使你的阅读代码对小错误更加健壮,那么你就需要注册许多痛苦和维护工作。其他人可能会破坏你的代码与每个微小的补丁,因为当他们进行单元测试等时,这种像素精确到位级通常是没有问题的。更不用说硬件和软件层的无限排列了是可能的,并且所有可能都会对精确的像素位产生影响。

如果您只需要这两个操作:线条(具有不同的宽度和颜色)和四边形(有/无纹理),我建议您编写自己的渲染/光栅化代码,该代码在表示图像像素的8位uint数组上运行( R8G8B8)。你提议的操作并不是太讨厌,所以如果性能不重要,那么从长远来看这可能是更好的方法。

相关问题