0

这是否意味着每个顶点的数据集只能传递总共8 个浮点值?

这是否意味着您只能拥有以下一项?

  • FLOAT_4的2 个输入。
  • FLOAT_2的4 个输入。
  • FLOAT_1的8个输入。
  • 任何可以加起来总共有8 个浮点值的混合物?

是这样吗?因为如果是这样,那么在他们的文档中说可以使用 8 个输入确实具有误导性。

也许我遇到了麻烦,因为我没有正确格式化我的数据,但我试图使用9 floats per vertices,如:

  • va0 将是FLOAT_4,偏移量设置为0
  • va1 将是FLOAT_4,偏移量设置为4
  • va2 将是FLOAT_1,偏移量设置为8

但是这个实验的屏幕上什么也没有出现。我是否超出了 VertexShader 输入限制?

4

2 回答 2

0

我相信限制不是关于顶点的大小,而是关于你的 GLSL 着色器中的顶点属性的数量。

我对 Stage3D 不太熟悉,但这更像是一个 OpenGL 问题。在纯 OpenGL 中,您必须使用函数启用顶点属性glEnableVertexAttribArray(int)。此限制意味着此方法的唯一有效数字是 0 到 7。

以一种更容易检查您自己的代码的方式,这在顶点着色器中是不允许的:

attribute vec4 in_one;
attribute vec4 in_two;
attribute vec3 in_three;
attribute vec2 in_four;
attribute vec4 in_five;
attribute vec3 in_six;
attribute vec4 in_seven;
attribute vec2 in_eight;
attribute vec4 in_nine;
...
void main()
{
    ...
}

注意:属性的大小(vec2-4)无关紧要,有 9 个属性的事实将超过限制。

于 2011-12-31T04:01:10.237 回答
0

好的,所以我发现了问题。

如果您在顶点数据(每个顶点)中定义更多值,例如从此格式进行修改:

position: x  va0.x
          y  va0.y
          z  va0.z
          w  va0.w
color:    r  va1.r
          g  va1.g
          b  va1.b
          a  va1.a

像这样:

position: x  va0.x
          y  va0.y
          z  va0.z
          w  va0.w
color:    r  va1.r
          g  va1.g
          b  va1.b
          a  va1.a
uv:       u  va2.x
          v  va2.y

太好了...您在组合中添加了一个新寄存器。但是你要做的是:

  • 确保在以下位置传递正确的值:

    context3D.createVertexBuffer(numOfVertices, vertexDataLength);和...

    uploadFromVector(_vertexData, 0, numOfVertices);

  • 确保在调用中设置正确的偏移量:

    context3D.setVertexBufferAt(2, vertexBuffer, 8, Context3DVertexBufferFormat.FLOAT_4);

  • 最后但同样重要的是(正是我所缺少的)......在您的着色器中使用该寄存器!

如果您添加了一个新的顶点属性,但您没有在 AGAL 代码中使用它......它不会渲染!

希望这可以节省其他人一些时间,想知道他们的着色器哪里出了问题!

注意:我知道,常识——如果你创造了一些东西,你为什么不使用它呢?我正在测试以前的着色器是否仍然可以处理额外的数据。确实如此,只要我没有在混合中分配我的新顶点属性(va2)。因此,如果您正在测试,请确保仅setVertexBufferAt(...)与您实际使用的输入寄存器一起使用。

于 2011-12-31T05:32:22.597 回答