Проверьте, предоставлен ли атрибут для шейдера - PullRequest
0 голосов
/ 24 апреля 2018

Я рисую многочисленные треугольники в приложении на основе WebGL. Некоторые из этих треугольников нужно перевести, что я планирую сделать на стороне шейдера. Я добавил attribute vec3 vTranslate; в свой вершинный шейдер.

Я бы хотел сделать следующее:

if(condition_that_vTranslate_is_buffered)
{
    // Do translation
}

Однако я не нашел условия, которое работает. Хотя я мог бы просто предоставить [0, 0, 0] для каждой точки, которая не переводится, я бы предпочел не тратить эти данные в конвейере.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Я не совсем уверен, понимаю ли я вопрос, но основываясь на том, что я сделал:

attribute vec4 aPosition;
attribute vec3 vTranslate;

void main(){

   vec4 worldPosition = modelMatrix * vec4(aPosition.xyz,1.);

   worldPosition.xyz += vTranslate * aPosition.w;

   gl_Position = ndc * view * worldPosition;

}

В некоторых местах не рекомендуется использовать операторы if в шейдере, если они могут быть выполнены иначе.

0 голосов
/ 24 апреля 2018

Хотя я мог бы просто предоставить [0, 0, 0] для каждой точки, которая не переводится, я бы предпочел не тратить эти данные в конвейере.

The спецификация WebGL 1.0;5.13.10 Униформа и атрибуты относится к Спецификация OpenGL ES 2.0.25 .См. Раздел 2.7 Текущее состояние вершины:

Начальные значения для всех общих атрибутов вершины: (0, 0, 0, 1).

Это означает, что текущая вершинасостояние атрибута вершины отключено (disableVertexAttribArray), тогда значение атрибута вершины в вершинном шейдере равно (0, 0, 0, 1) соответственно (0, 0, 0) для атрибута типа vec3,Таким образом, вам не нужно «тратить» данные, и вам не нужно указывать общие данные массива вершин, инициализированные (0, 0, 0).Просто отключите массив вершин, который вызывает тот же результат, значение атрибута (0, 0, 0) в вершинном шейдере.

...