Параметр атрибута в вершинном шейдере - PullRequest
0 голосов
/ 29 июня 2011

Я работаю над Opengl-es 2.0 в Ubuntu 10.10 с помощью pvrsdk.В моем коде я беру вершины треугольника для рендеринга, но когда мне нужно использовать параметр Attribute в вершинном шейдере.как это меняется

Я вижу, что в примерах они используют myVertex.что подразумевается под этим.

вот так:

const char* pszVertShader = "\
    attribute highp vec4    myVertex;\
    uniform mediump mat4    projmatrix;\
    invariant gl_Position;\
    void main(void)\
    {\
        gl_Position = projmatrix * myVertex;\
    }";


===============================render======================
glBindAttribLocation(uiProgramObject, VERTEX_ARRAY, "myVertex");

Так что я просто хочу знать, что я беру вершины из текстового файла, это повлияет на атрибут myVertex.

если вам нужна другая информация, я могу предоставить вам весь свой код в предыдущем вопросе здесь

.

1 Ответ

2 голосов
/ 29 июня 2011

OpenGL 3 / OpenGL-ES 2 отказались от концепции предопределенных атрибутов вершин "position", "normal", "texcoord",…, которые предоставляются через glVertexPointer, glNormalPointer, glTexCoordPointer,…

Вместов ваших шейдерах вы вводите пользовательские varyings / in идентификаторы атрибутов.На эти идентификаторы ссылается так называемый атрибут location , числовой индекс.glBindAttribLocation позволяет присваивать идентификаторы атрибутов определенным местоположениям.В случае вышеупомянутого фрагмента кода, кажется, существует глобальная константа VERTEX_ARRAY - введенная программным кодом (!), Т.е. не предопределенная OpenGL или чем-то в этом роде, - которая универсально используется для атрибута varing / in myVertexв шейдере.

Таким образом, конкретный атрибут вершины может быть снабжен данными glVertexAttribPointer через общий токен VERTEX_ARRAY в выражении, подобном следующему:

glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, false, 0, isVBO ? (char*)vertex.offset : (char*)vertex.data + vertex.offset);

Конечно, точная семантика вызовов glVertexAttribPointer зависит от конкретной программы, которая их выполняет.

Вместо (глобальной) константы VERTEX_ARRAY вы также можете использовать переменную shader.attrib.vertex, которую выустановить для каждого шейдера, используя

shader.attrib.vertex = glGetAttribLocation(shader.program_object, "myVertex");

и использовать эту переменную в вызовах glVertexAttribPointer

glVertexAttribPointer(shader.attrib.vertex, …)
...