Как включить Vertex Buffer Array в мою графическую программу? - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу набор инструментов для трехмерной графики для Python и PyQt5, используя PyOpenGL. Я пишу свои собственные шейдеры для go вместе с ним, если это поможет. То, что я пытаюсь сделать, это go от использования glBegin до использования Vertex Buffer Array. Я нашел следующее при использовании VBO:

http://www.songho.ca/opengl/gl_vbo.html - я мог только собрать немного информации из этого, потому что это на C / C ++.

Как заставить VBO работать с Python и PyOpenGL - Это было в Python2 и в результате было довольно ограниченным.

Однако я не могу собрать воедино то, что мне нужно возьмите вершины каждого из моих объектов формы и скомпилируйте их в сцену VBO. Я также понятия не имею, как выкладываются данные в массиве. Ниже приведены функции initGL и paintGL, а также код GLSL моих вершинных и фрагментных шейдеров.

    def initGL(self):
        self.vertProg = open(self.vertPath, 'r')
        self.fragProg = open(self.fragPath, 'r')
        self.vertCode = self.vertProg.read()
        self.fragCode = self.fragProg.read()
        self.vertShader = shaders.compileShader(self.vertCode, GL_VERTEX_SHADER)
        self.fragShader = shaders.compileShader(self.fragCode, GL_FRAGMENT_SHADER)
        self.shader = shaders.compileProgram(self.vertShader, self.fragShader)

#paintGL uses shape objects, such as cube() or mesh(). Shape objects require the following:
#a list named 'vertices'  - This list is a list of points, from which edges and faces are drawn.
#a list named 'wires'     - This list is a list of tuples which refer to vertices, dictating where to draw wires.
#a list named 'facets'    - This list is a list of tuples which refer to vertices, ditating where to draw facets.
#a bool named 'render'    - This bool is used to dictate whether or not to draw the shape.
#a bool named 'drawWires' - This bool is used to dictate whether wires should be drawn.
#a bool named 'drawFaces' - This bool is used to dictate whether facets should be drawn.

    def paintGL(self):
        shaders.glUseProgram(self.shader)
        glLoadIdentity()
        gluPerspective(45, self.sizeX / self.sizeY, 0.1, 110.0)    #set perspective?
        glTranslatef(0, 0, self.zoomLevel)    #I used -10 instead of -2 in the PyGame version.
        glRotatef(self.rotateDegreeV + self.vOffset, 1, 0, 0)    #I used 2 instead of 1 in the PyGame version.
        glRotatef(self.rotateDegreeH, 0, 0, 1)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

        for s in self.shapes:
            if s.drawWires:
                glBegin(GL_LINES)
                for w in s.wires:
                    for v in w:
                        glVertex3fv(s.vertices[v])
                glEnd()

            if s.drawFaces:
                glBegin(GL_QUADS)
                for f in s.facets:
                    for v in f:
                        glVertex3fv(s.vertices[v])
                glEnd()

Вершинный шейдер:

#version 120    
void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Фрагментный шейдер:

#version 120
void main() {
    gl_FragColor = vec4( 0, 1, 0, 1 );
}

В окончательной форме этого проекта я хочу, чтобы в моем буфере была информация о позициях вершин, цвете и, возможно, даже свечение. (Это будет достигнуто, когда я в конце концов положу это на марширование лучей.) Мне также нужен способ указать, следует ли мне рисовать провода и грани.

Как настроить и настроить одно или несколько VBO передать всю эту информацию в GPU и OpenGL?

Python 3.7.6, Windows 10

1 Ответ

1 голос
/ 03 апреля 2020

Через некоторое время я решил попробовать использовать менее точные c условия поиска. В конце концов я наткнулся на этот сайт: https://www.metamost.com/opengl-with-python/

...