【问题标题】:Color picking wide lines on 1x1 viewport not working in OpenGL1x1 视口上的颜色拾取宽线在 OpenGL 中不起作用
【发布时间】:2016-10-06 21:56:44
【问题描述】:

在从 Geforce 切换到 Radeon 卡后,我遇到了一个奇怪的问题。

线宽是 6。问题是:如果线平行于视口的 x 或 y 轴,它的行为就好像它只有 1 个像素宽。如果这条线是一个角度,它工作正常。因此,例如,如果线从 (10, 12) 到 (110, 12) 它不起作用(平行于 x 轴),但如果它从 (10, 12) 到 (110, 13) 它正在工作很好。

正常渲染总是可以正常工作。

不同之处在于,对于颜色选择,我只渲染 1x1 视口。如果我为拾取渲染一个完整的视口,一切正常。所以我的猜测是剪辑不能正确处理这些极端情况。

将根据要求发布代码,但考虑到错误情况的具体程度,我怀疑它是否有用。有没有人遇到过这样的问题?

【问题讨论】:

  • 投反对票并结束投票,但没有评论。有什么问题?
  • 所以你基本上是在渲染一条线,实际的线中心在视口之外,但是由于线宽,你希望你的视口像素仍然受到它的影响吗?如果这在 Geforce 上有效,那么你就很幸运了,因为 OpenGL 的裁剪规则根本不需要它来工作。 OTOH,无论如何都不推荐使用宽线,您最好将它们绘制为矩形,这也适用于剪裁。
  • @derhass 好的。我只是觉得奇怪的是它大部分都在工作,除了在这个看似特定的情况下。谢谢。

标签: opengl


【解决方案1】:

不同之处在于,对于颜色选择,我只渲染一个 1x1 视口。

顶点被剪裁到视口内。因此,如果一条线部分位于视口中,则顶点将被剪裁为完全在视口内。

如果该线完全在视口之外,则 OpenGL 规范规定该线将被丢弃考虑线的宽度。

NVIDIA 的实施一直对此进行快速而松散的处理。 AMD 的要求更严格,但显然它有时对您有用。但是按照规范,除非线条实际上在视口内,否则它根本不应该工作。

【讨论】:

    【解决方案2】:

    4.5 规范说:

    13.5 原始剪辑

    [...]如果基元是线段,则如果它完全位于剪切体积内,则剪切对其没有任何作用,如果它完全位于体积外,则将其丢弃。

    如果线段的一部分位于体积内而部分位于体积之外,则线段被剪裁,并为一个或两个顶点计算新的顶点坐标。剪裁线段端点位于原始线段和剪裁体的边界上。

    此裁剪为每个裁剪的顶点生成一个值 0 ≤ t ≤ 1。如果 裁剪顶点的坐标为 P,原始顶点的坐标为 P₁ 和 P₂,则 t 由下式给出

                              P = t∙P₁ + (1 - t)∙P₂.
    

    t 的值用于裁剪顶点着色器输出,如第 13.5.1 节所述。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 2016-06-13
      • 2014-08-31
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多