1

我一直在尝试使用更复杂的着色器,并且遇到了顶点着色器和纹理采样器使用的坐标系问题。简而言之:它们似乎没有任何意义,并且在尝试测试它们时,我最终得到不一致的结果。更糟糕的是,互联网上几乎没有文档,而且我发现的大多数信息似乎都希望我知道这是如何工作的。我希望有人可以澄清以下内容:

  • 顶点着色器传递一个 (x, y, z) 表示渲染目标上的位置。x、y 和 z 的可接受值是多少?
  • x 和 y 如何对应后台缓冲区的宽度和高度(假设它是渲染目标)?
  • x 和 y 如何对应输出纹理的宽度和高度(假设它是渲染目标)?
  • 当 x=0 和 y=0 时,顶点在哪里?
  • 纹理采样器在 (u, v) 坐标处对纹理进行采样。u 和 v 的可接受值是多少?
  • u 和 v 如何与被采样纹理的宽度和高度对应?
  • AGAL 的 wrap、clamp 和 repeat 标志如何改变采样,如果没有给出默认行为是什么?
  • 在 u=0 和 v=0 采样时,哪个像素按位置返回?

编辑: 根据我的测试,我相信答案是:

  • 不确定
  • -1 是左/下,1 是右/上
  • 不确定
  • 在输出的中心
  • 不确定
  • 0 是左/下,1 是右/上
  • 不确定
  • 纹理的最左下角
4

1 回答 1

1
  • 您通常使用自己的坐标系,然后将每个顶点的位置乘以MVP(模型-视图-投影)矩阵以获得 NDC 坐标,该坐标可以作为顶点着色器的输出馈送到 GPU。有一篇很好的文章解释了 Stage3D 的所有内容。
  • 正确的。z 在 [0, 1] 范围内
  • 渲染到渲染目标与渲染到后缓冲区相同——您从顶点着色器输出 NDC,因此纹理的实际大小无关紧要。
  • 是的,屏幕中心。
  • 通常,它是 [0, 1] 但您可以使用超出该范围的值,然后输出取决于采样器上设置的纹理环绕模式(如重复钳位)。
  • (0, 0) 是左/上,(1, 1) 是右/下。
  • 默认一个是重复。当您使用超出 [0, 1] 范围的坐标进行采样时,这些模式决定了您将获得什么。重复[1.5, 1.5]将导致 [0.5, 0.5] 而 [1.0, 1.0] 将是如果模式设置为钳位的结果。
  • 纹理的左上角像素。
于 2014-03-19T08:25:41.023 回答