Что именно Adobe подразумевает под VertexShader, имеет ограничение в 8 входов? - PullRequest
0 голосов
/ 31 декабря 2011

Означает ли это, что в каждом наборе данных вершин может быть передано всего 8 значений с плавающей точкой ?

Означает ли это, что вы можете иметь только одно из следующего?

  • 2 входы FLOAT_4 .
  • 4 входы FLOAT_2 .
  • 8 входы FLOAT_1 .
  • Любая смесь, которая в сумме составит 8 значений с плавающей точкой значений?

Это так? Потому что, если это так, в их документации вводит в заблуждение, что можно использовать 8 входов.

Возможно, у меня возникли проблемы, потому что я неправильно отформатировал свои данные, но я пытаюсь использовать 9 с плавающей точкой на вершин , как в:

  • va0 будет FLOAT_4 , смещение установлено на 0 .
  • va1 будет FLOAT_4 , смещение установлено на 4 .
  • va2 будет FLOAT_1 , смещение установлено на 8 .

Но в этом эксперименте на экране ничего не появляется. Превышаю ли я предел входных данных VertexShader?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2011

Хорошо, я обнаружил проблему.

Если вы определите больше значений в ваших данных вершин (по вершинам), например, сделав изменение в этом формате:

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(...) только с теми входными регистрами, которые вы фактически используете.

0 голосов
/ 31 декабря 2011

Я полагаю, что ограничение касается не размера вершин, а количества атрибутов вершин в вашем шейдере 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 атрибутов, будет превышать предел.

...