【问题标题】:How does OpenGL render its triangles?OpenGL如何渲染它的三角形?
【发布时间】:2012-07-28 17:58:16
【问题描述】:

我需要一种算法来在不使用 OpenGL 的情况下渲染像素完美三角形。

我在哪里可以得到像 OpenGL 使用的这样的算法?最好是单线程的。

它必须像 OpenGL 那样做,因为 OpenGL 不会在共享边的两个三角形上留下间隙或重叠像素。扫描线方法会出现这些错误:http://joshbeam.com/articles/triangle_rasterization/。我也尝试了这个半空间算法:http://devmaster.net/forums/topic/1145-advanced-rasterization/ 但我无法让它工作(呈现胡言乱语)。

  • OpenGL 是如何做到的?工作强度太大,我应该忘记它并改用(有问题的)扫描线方法吗?

  • 我在哪里可以得到算法?

我更喜欢 C++ 解决方案,但语言不是问题。

【问题讨论】:

  • OpenGL 是一个规范,它不包含算法。我假设您在谈论 OpenGL 实现?
  • 不留空隙并不是任何单一算法所特有的,如果是这样,它只是一个错误。
  • 为什么禁止使用 OpenGL?如果是缺乏对硬件的访问权限,则可以通过软件对其进行仿真。

标签: c++ algorithm opengl language-agnostic rendering


【解决方案1】:

OpenGL 使用基于扫描线的方法,正如 Alan 和您的文章链接所提到的。然而,管理差距不是数学准确性的问题。您需要对三角形边缘的像素进行额外的约定。 OpenGL 使用的约定与 Direct3D 使用的约定相同。它被称为“左上角”,我见过的最好的解释是在这个MSDN rasterization rules article 上。

【讨论】:

    【解决方案2】:

    典型的 OpenGL 实现将使用与您的第一个链接大致相同的扫描线/光栅化方法。避免差距和重叠的关键是在数学上要非常小心,以避免舍入误差的不确定性。

    如果您将像素视为具有有限区域的屏幕正方形,那么您可能会出现重叠,因为相邻的三角形通常都会与像素重叠。但是,如果您将像素视为正方形中心的无限小点,则可以保证没有间隙或重叠。

    您还需要定点整数数学的算术确定性,而不是浮点数学的舍入误差。每条光栅化扫描线的左端从大于或等于起始扫描值的第一个像素开始。光栅化扫描线的右端在严格小于结束扫描值的第一个像素之前结束。

    【讨论】:

      【解决方案3】:

      查看OpenMesa,这是 OpenGL 规范的开源实现。它目前最高支持 OpenGL 3.0。

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 1970-01-01
        • 2020-04-05
        • 2017-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多