2015-05-29 3 views
2

Я читал в учебниках, что абсолютный минимум нуждается в вершинном шейдер определяет следующим образом:OpenGLES 2,0 Vertex Shader Атрибуты

attribute vec3 v3_variable; 
attribute vec3 v3Pos; 

void main() 
{ 
    gl_Position = v3Pos; 
} 

OpenGLES переходит к данным шейдера вершин в v3Pos но имя этого переменный может фактически быть любым, другие учебники назовите его a_Position, a_Pos, что угодно ~.

Так что мой вопрос в том, как OpenglES знает, что когда я звоню glVertexAttribPointer(), он знает, что он должен поместить эти данные в v3Pos вместо v3_variable?

+0

с оформлением заявления более ясно, что он основан на индексе, см. Https://www.opengl.org/wiki/Layout_Qualifier_(GLSL) –

ответ

1

Есть два способа определения того, какие атрибуты в ваших шейдерах получить «в паре» с данными, вы предоставляете glVertexAttribPointer. Единственный идентификатор, который вы получаете с glVertexAttribPointer, - это index (первый параметр), поэтому это должно быть сделано индексом как-то.

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

GLint program = ...; 
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos"); 
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable"); 
glVertexAttribPointer(v3PosAttributeIndex, ...); 
glVertexAttribPointer(v3varAttributeIndex, ...); 

Вы также можете явно задать расположение атрибутов при авторизации шейдер (как комментарий @ JP предполагает), так что вы бы изменить свой шейдер, как так:

layout(location = 1) in vec3 v3_variable; 
layout(location = 0) in vec3 v3Pos; 

, а затем в код вы бы установить их в явном виде:

glVertexAttribPointer(0, ...); // v3Pos data 
glVertexAttribPointer(1, ...); // v3_variable data 

Этот второй метод работает только в GLES 3.0+ (и OpenGL 3.0+), поэтому он не может быть применимо к вашему случаю, если вы используете только GLES 2,0. Также обратите внимание, что вы можете использовать оба этих метода вместе. Например. даже если вы явно определяете макеты, это не ограничивает вас последующим запросом.

+0

ES 2.0, который использует OP, не поддерживает квалификатор 'location'. Он также использует атрибут 'attribute' для переменных атрибута, а не' in'. –

+0

Спасибо за объяснение! Я понял эту идею сейчас :) – CodingNinja

1

Итак, на стороне приложения вы будете иметь вызов, который выглядит как любой

glBindAttribLocation(MyShader, 0, "v3Pos"); 

(перед тем, как связать шейдеры) или

vertexLoc = glGetAttribLocation(MyShader, "v3Pos"); 

После связать программу.

Тогда первым элементом вызова glVertexAttribPointer будет либо 0, либо vertexLoc.

glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0)); 

Короче говоря, гл компоновщик будет либо назначить v3Pos это собственное место в памяти, или уйти от того, что вы говорите это. В любом случае вам придется выполнить некоторое взаимодействие с шейдером, чтобы взаимодействовать с атрибутом.

Надежда, что помогает

+0

Спасибо за ответ! Не понял, что первым параметром был индекс для самого атрибута. Теперь я: D – CodingNinja

Смежные вопросы