【问题标题】:OpenGL pixel precise rasterizing on different archsOpenGL像素精确光栅化不同的拱门
【发布时间】:2012-04-19 15:46:43
【问题描述】:

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

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

很容易...但是...

所有坐标在像素空间中都是整数,而且非常重要:glReading all the pixel from the framebuffer 在两台不同的机器上,使用两个不同的显卡,运行两个不同的操作系统(Linux 和 freebsd), 必须产生完全相同的位序列(给定适当的常量格式转换)。

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

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

【问题讨论】:

  • 我认为更好的方法是忘记光栅化的准确性并将结果句柄作为非精确(+/-几个像素)整体光栅化误差约为 0.5 像素(如果我没记错的话)所以安全考虑所有具有 2-3 像素精度的对象。 (您也可以将标记添加到关键对象...一个具有不同颜色的像素)。另一种方法是使用 GLSL(忘记 OpenGL 管道并创建自己的具有预定精度行为)

标签: opengl rasterizing mesa


【解决方案1】:

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

无论如何,如果您依赖外部渲染代码,并且无法使您的阅读代码对小错误更加健壮,那么您将承担大量的痛苦和维护工作。其他人可能会用每个小补丁破坏您的代码,因为在他们进行单元测试等时,这种像素级的精确度通常不是问题。更不用说硬件和软件层的无限排列了都是可能的,并且都可能对确切的像素位产生影响。

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

【讨论】:

  • 谢谢,但这并不是真正的设计缺陷。我正在编写的安全应用程序需要它。太糟糕了,因为它包含 NDA,所以我无法输入更多细节。但是我可以看出,发布后硬件和软件都不会发生变化,所以我理解您对维护工作的担忧,但这不是问题。关于自定义光栅化器...这是我正在评估的一个选项,但是,你知道,我想编写尽可能少的代码。:-)
  • 好的,既然你有不变的(并且希望是已知的)硬件和软件,现在这不是不可能的,只是很难。问题是,您有两个不同的操作系统,因此有不同的编译器。为了保证相同的结果,您至少需要确定性浮点算法(IEEE 754,stackoverflow.com/questions/328622/…)。然而,这通常只有在使用相同的编译器时才有可能(即使是较小的编译器版本更改也会破坏这一点)。我的建议:实验。如果它有效,永远不要改变任何东西;)
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2020-03-27
相关资源
最近更新 更多