Python OpenGL отправляет данные в шейдер - PullRequest
1 голос
/ 02 апреля 2019

что работает:

шейдер

#version 330 core

attribute vec3 pos;
attribute vec2 uv;

    out vec3 color;

    uniform mat4 view;
    uniform mat4 projection;

    void main() {
      gl_Position = projection * view * vec4(pos.xy, sin(10.0*(pos.x + pos.y))/8.0 + 1.0, 1.0);
      color = vec3(pos.xy, sin(10.0*(pos.x + pos.y))/8.0);
    }

питон

vao = glGenVertexArrays(1)
glBindVertexArray(vao)
#                            [x, y, z]
vertices = vbo.VBO(np.array([[...],[...],...], dtype=np.float32))

def draw():
    glUseProgram(program)

    glUniformMatrix4fv(projectionLoc, 1, False, perspectiveMatrix)
    glUniformMatrix4fv(viewLoc, 1, False, viewMatrix)
    vertices.bind()
    glEnableClientState(GL_VERTEX_ARRAY)
    glVertexPointer(3, GL_FLOAT, 12, vertices)
    glDrawArrays(GL_TRIANGLES, 0, lenVerticesArray)
    vertices.unbind()

Я хотел бы либо иметь отдельный массив значений uv [x, y] для перехода к атрибуту uv, либо добавить их к текущим вершинам как [x, y, z, ux, uy] и иметь те, которые являются атрибутом ультрафиолета.

Я попытался сделать следующее с помощью [x, y, z, ux, uy]:

glEnableVertexAttribArray(posLoc)
glVertexAttribPointer(posLoc, 3, GL_FLOAT, False, 12, vertices)
glEnableVertexAttribArray(uvLoc)
glVertexAttribPointer(uvLoc, 2, GL_FLOAT, False, 12, vertices+12)

Однако это не работает. Все остальное, что я пробовал, является некоторым вариантом этого, но все это не помогает. Кажется, я не понимаю, что нужно делать, чтобы отправить данные.

1 Ответ

1 голос
/ 02 апреля 2019

5-й параметр glVertexAttribPointer - это смещение в байтах между последовательными общими атрибутами вершин.

В вашем случае кортеж атрибутов состоит из 5 чисел с плавающей запятой [x, y, z, uxуу].Таким образом, смещение должно быть 5 * 4 = 20.

Если именованный буферный объект связан, то 6-й параметр glVertexAttribPointer обрабатывается как байтовое смещение в хранилище данных буферного объекта.Но в любом случае тип параметра - указатель (c_void_p).

Таким образом, если смещение равно 0, то 5-й параметр может быть либо None, либо c_void_p(0), иначе смещение должно быть приведено к c_void_p:

glBindVertexArray(vao)

glEnableVertexAttribArray(posLoc)
glEnableVertexAttribArray(uvLoc)

vertices.bind()
glVertexAttribPointer(posLoc, 3, GL_FLOAT, False, 20, None)
glVertexAttribPointer(uvLoc, 2, GL_FLOAT, False, 20, c_void_p(12))

vertices.bind() предполагается, что он связывает объект массива вершин (glBindBuffer(GL_ARRAY_BUFFER, vbo)).
Когда вызывается glVertexAttribPointer, спецификация массива общих атрибутов вершин сохраняется в векторе состояний текущего объекта массива вершин .Таким образом, VAO должен быть связан до (glBindVertexArray(vao)).
Кроме того, ссылка на имя текущего привязанного объекта буфера вершин хранится в VAO.Каждый атрибут вершины имеет свою собственную ссылку VBO.Все они могут быть одинаковыми или разными для всех или некоторых атрибутов.Поэтому объект Vertex Buffer также должен быть связан ранее.

...