对于我正在开发的应用程序,我需要能够
- 绘制不同宽度和颜色的线条
- 绘制纯色填充三角形
- 绘制带纹理(无 Alpha)四边形
很容易...但。。。
所有坐标在像素空间中都是整数,并且非常重要:gl从帧缓冲区读取所有像素在两台不同的机器上,使用两个不同的显卡,运行两个不同的操作系统(Linux 和 freeBSD),必须产生完全相同的位序列(给定适当的常量格式转换)。
我认为使用 opengl 和硬件加速不可能安全地实现这一点,因为我打赌不同的图形卡(来自不同供应商)可以实现不同的光栅化算法。(OpenGl 规范对此很清楚,因为它们提出了一种算法,但它们也指出实现可能有所不同。在某些情况下)。此外,我真的不需要硬件加速,因为我将渲染非常低的速度和简单的图形。
您认为我可以通过禁用硬件加速来实现这一点吗?在这种情况下,在 linux 下会发生什么,我会默认MESA软件光栅器?在这种情况下,我能确定它总是有效还是我错过了一些东西吗?
您以渲染像素回读并强烈依赖于它们的数学准确性/可再现性,这听起来像是一个设计缺陷。此操作的目的是什么?例如,如果您需要从图像中提取一些信息,为什么不在渲染之前尝试从抽象的矢量化信息中提取此信息?
无论如何,如果你依赖于外部渲染代码,并且没有办法让你的阅读代码对小错误更健壮,那么你就会承担很多痛苦和维护工作。其他人可能会用每一个微小的补丁来破坏你的代码,因为在他们进行单元测试等时,这种像素对位级的精确性通常不是问题。更不用说可能的硬层和软件层的无限排列了,所有这些都可能对确切的像素位产生影响。
如果你只需要这两个操作符:线条(具有不同的宽度和颜色)和四边形(有/没有纹理),我建议编写自己的渲染/光栅器代码,该代码在表示图像像素的 8 位 uint 数组上运行 (R8G8B8)。您提出的操作并不太令人讨厌,因此,如果性能不重要,那么从长远来看,这实际上可能是更好的方法。