2014-03-18 171 views
1

我一直在尝试使用更复杂的着色器,并遇到顶点着色器和纹理采样器使用的坐标系问题。简而言之:他们似乎没有任何意义,而当试图对它们进行测试时,我最终会得到不一致的结果。更糟糕的是,互联网对文档没什么影响,我发现的大部分信息似乎都希望我知道它是如何工作的。我希望有人可以澄清以下内容:Stage3D,AGAL - 顶点和纹理坐标系

  • 顶点着色器通过表示渲染目标位置的(x,y,z)。 x,y和z的可接受值是多少?
  • x和y如何对应后缓冲区的宽度和高度(假设它是渲染目标)?
  • x和y如何对应输出纹理的宽度和高度(假设它是渲染目标)?
  • 当x = 0和y = 0时,顶点位置在哪里,位置方向?
  • 纹理采样器在(u,v)坐标处对纹理进行采样。 u和v的可接受值是多少?
  • u和v如何对应被采样纹理的宽度和高度?
  • AGAL的包裹,钳位和重复标记如何改变采样,以及没有给出的默认行为是什么?
  • 在u = 0和v = 0采样时,哪个像素返回位置方向?

编辑: 从我的测试中,我相信答案是:

  • 不确定
  • -1左/底,1为右/上
  • 不确定
  • 在输出的中心
  • 不确定
  • 0左/底,1为右/上
  • 不确定
  • 远左下角的纹理
+0

你是在学习这个,是为了你自己的理解,还是为了你可以使用Stage3D来制作一些东西? – Marty

+0

两个!我之前使用过像素着色器,但是它们是更高级的,因此在语法上与Flash中使用的不同。如果这些问题得到解答,我应该可以毫无困难地继续下去。 在提出这个问题之前:我不愿意使用现有的引擎(Starling,Away3D等) - 我的应用程序的工作方式使得这些程序无论如何都无济于事。 – Conduit

+0

当然,这很好。我没有这个编程水平的大脑,所以我确实会推荐一些现有的东西:-) – Marty

回答

1
  • 您通常使用自己的坐标系统,然后乘的位置每个顶点由MVP(模型 - 视图 - 投影)矩阵组成,以获得可作为顶点着色器的输出馈送到GPU的NDC坐标。有一个nice article解释了Stage3D的所有内容。
  • 正确。 z在范围[0,1]
  • 渲染到渲染目标与渲染到背景缓冲区相同 - 从顶点着色器输出NDC,因此纹理的实际大小是不相关的。
  • 是的,屏幕的中心。
  • 通常,它`[0,1],但可以使用该出去该范围中,然后将输出取决于对采样器设置纹理涡卷模式(如重复)值。
  • (0,0)左/上,(1,1)右/下。
  • 默认一个是重复。这些模式决定了使用超出[0,1]范围的坐标进行采样时会得到的结果。如果重复 [1.5,1.5]将导致[0.5,0.5],而如果模式设置为clamp,将会导致[1.0,1.0]。
  • 纹理的左上角像素。
+0

感谢您在纹理采样过程中对原点的实际位置进行了修正 - 看起来我的其他假设导致翻转了水平通道上的所有内容!那么重复和包装会有什么区别呢?如果这是重复操作的方式,他们听起来像是会做同样的事情。 – Conduit

+0

此外,为了清晰起见 - 渲染到纹理时,无论纹理大小如何,顶点(-1,-1,0)都会呈现在纹理的左下角。 (1,1,0)会呈现在右上角。 – Conduit

+0

不知道,但包装似乎是以另一个名称重复。 – Varnius