Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 阶段3d,AGAL-顶点';和纹理';坐标系_Actionscript 3_Pixel Shader_Stage3d_Agal - Fatal编程技术网

Actionscript 3 阶段3d,AGAL-顶点';和纹理';坐标系

Actionscript 3 阶段3d,AGAL-顶点';和纹理';坐标系,actionscript-3,pixel-shader,stage3d,agal,Actionscript 3,Pixel Shader,Stage3d,Agal,我一直在尝试使用更复杂的着色器,但遇到了顶点着色器和纹理采样器使用的坐标系的问题。简言之:它们似乎没有任何意义,当尝试测试它们时,我最终得到了不一致的结果。更糟糕的是,互联网上几乎没有文档记录,我发现的大部分信息似乎都希望我知道这是如何运作的。我希望有人能澄清以下几点: 顶点着色器传递表示渲染目标上位置的(x、y、z)。x、y和z的可接受值是多少 x和y如何对应于后缓冲区的宽度和高度(假设它是渲染目标) x和y如何对应于输出纹理上的宽度和高度(假设它是渲染目标) 当x=0和y=0时,顶点位于何

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

  • 顶点着色器传递表示渲染目标上位置的(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为右/上
  • 不确定
  • 纹理的左下角
      • 通常使用自己的坐标系,然后将每个顶点的位置乘以(模型视图投影)矩阵,以获得NDC坐标,该坐标可以作为顶点着色器的输出提供给GPU。第3d阶段有一个解释
      • 对。z在[0,1]范围内
      • 渲染到渲染目标与渲染到backbuffer相同-您可以从顶点着色器输出NDC,因此纹理的实际大小无关
      • 是的,屏幕中央
      • 通常情况下,它是[0,1],但您可以使用超出该范围的值,然后输出取决于采样器上设置的纹理包裹模式(如重复或夹紧)
      • (0,0)是左/上,(1,1)是右/下
      • 默认值是repeat。这些模式决定了当您使用超出[0,1]范围的坐标进行采样时将得到什么。重复[1.5,1.5]将导致[0.5,0.5],而如果模式设置为钳制,则会导致[1.0,1.0]
      • 纹理的左上角像素

      您学习这些是为了自己的理解,还是为了使用Stage3D制作一些东西?两者都有!我以前使用过像素着色器,但它们的级别更高,因此在语法上与Flash中使用的不同。如果这些问题都得到了回答,我就可以毫无困难地继续下去了。在这个问题被问到之前:我不愿意使用现有的引擎(Starling、Away3D等)——我的应用程序的工作方式是这样的,这些程序不会有多大帮助,如果有的话。当然,知道这一点很好。我没有这种编程水平的头脑,所以我确实打算推荐一些现有的东西:-)无论如何,我当然很感谢你的尝试!感谢您在纹理采样期间对原点的实际位置进行的更正-看起来像是我的其他假设导致了在水平通道上翻转所有内容!那么,重复和包裹有什么区别呢?如果这是重复操作的方式,它们听起来会做同样的事情。此外,为了清晰起见,渲染到纹理时,顶点(-1,-1,0)将在纹理的左下角渲染,而不管纹理大小。(1,1,0)将在右上角渲染。不确定,但wrap似乎在另一个名称下重复。这是我从测试中收集的。。。奇怪的是他们会这么做。我做了一些测试,我的默认设置是“钳制”。也许这里还发生了其他事情?有两种方法可以设置换行模式-直接在着色器中设置换行模式(例如“tex ft0、ft1、fs0”或使用Context3D.setSamplerStateAt()。