pyOpenGL Треугольник не рисуется

1

Я только начал изучать pyOpenGL и столкнулся с проблемой, мой первый проект очень прост: я пытаюсь открыть окно и нарисовать простой треугольник с помощью шейдеров. Я использую glfw для создания окна, и все компилируется правильно, но Треугольник не рисуется.

Что-то не так с моим основным циклом или с использованием вершинного буфера? Мои шейдеры и объекты программы (кажется) работают.

Любая помощь будет принята с благодарностью.

import OpenGL.GL
import OpenGL
import glfw
import numpy

def createAndCompileShader(type, source):
    shader = OpenGL.GL.glCreateShader(type)
    OpenGL.GL.glShaderSource(shader, source)
    OpenGL.GL.glCompileShader(shader)


    result = OpenGL.GL.glGetShaderiv(shader, OpenGL.GL.GL_COMPILE_STATUS)

    if result != 1:
        raise Exception("Shader didn't compile properly\nShader compilation Log:\n" + str(OpenGL.GL.glGetShaderInfoLog(shader)))
    return shader


def createProgramWithShaders(shaders):

    ProgramIdentification = OpenGL.GL.glCreateProgram()

    for s in shaders:
        OpenGL.GL.glAttachShader(ProgramIdentification, s)

    OpenGL.GL.glLinkProgram(ProgramIdentification)

    linkStatus = OpenGL.GL.glGetProgramiv(ProgramIdentification, OpenGL.GL.GL_LINK_STATUS)
    infoLogLength = OpenGL.GL.glGetProgramiv(ProgramIdentification, OpenGL.GL.GL_INFO_LOG_LENGTH)
    for s in shaders:
        OpenGL.GL.glDetachShader(ProgramIdentification, s)
    for s in shaders:
       OpenGL.GL.glDeleteShader(s)

    return ProgramIdentification


glfw.init()

glfw.window_hint(glfw.SAMPLES, 4)
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, OpenGL.GL.GL_TRUE)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)

window = glfw.create_window(1000,800,"TESTING GLFW", None, None)
glfw.make_context_current(window)

glfw.set_input_mode(window,glfw.STICKY_KEYS, OpenGL.GL.GL_TRUE)

VAO = OpenGL.GL.glGenVertexArrays(1) 
OpenGL.GL.glBindVertexArray(VAO)    

vektoren = numpy.array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0], dtype='float32')
vertexBuffer = OpenGL.GL.glGenBuffers(1)
OpenGL.GL.glBindBuffer(OpenGL.GL.GL_ARRAY_BUFFER, vertexBuffer)
OpenGL.GL.glBufferData(OpenGL.GL.GL_ARRAY_BUFFER,len(vektoren), vektoren, OpenGL.GL.GL_STATIC_DRAW)

VertexSource = open("simpleVertexShader.glsl")
FragmentSource = open("simpleFragmentShader.glsl")

shaders = [createAndCompileShader(OpenGL.GL.GL_VERTEX_SHADER, VertexSource.read()), createAndCompileShader(OpenGL.GL.GL_FRAGMENT_SHADER, FragmentSource.read())]

VertexSource.close()
FragmentSource.close()
ProgramID = createProgramWithShaders(shaders)

OpenGL.GL.glClearColor(0.0,1.0,0.0,1.0)

while not glfw.window_should_close(window) and glfw.get_key(window, glfw.KEY_ESCAPE) != glfw.PRESS:
    OpenGL.GL.glClear( OpenGL.GL.GL_COLOR_BUFFER_BIT)
    OpenGL.GL.glUseProgram(ProgramID)

    OpenGL.GL.glEnableVertexAttribArray(0)
    OpenGL.GL.glBindBuffer(OpenGL.GL.GL_ARRAY_BUFFER, vertexBuffer)
    OpenGL.GL.glVertexAttribPointer(0, 3, OpenGL.GL.GL_FLOAT, OpenGL.GL.GL_FALSE, 0, None)

    OpenGL.GL.glDrawArrays(OpenGL.GL.GL_TRIANGLES, 0, 3)
    OpenGL.GL.glDisableVertexAttribArray(0)

    glfw.swap_buffers(window)
    glfw.poll_events()

glfw.terminate()

simpleVertexShader.glsl:

#version 330 core

layout(location = 0) in vec3 vertexposition_modelspace;

void main(){
    gl_Position.xyz = vertexposition_modelspace;
    gl_Position.w = 1.0;
}

simpleFragmentShader.glsl:

#version 330 core

out vec3 color;

void main(){
    color = vec3(1,0,0);
}
Теги:
opengl
glfw

1 ответ

0
Лучший ответ

Второй параметр glBufferData должен быть размером буфера в байтах, а не количеством элементов массива:

Рассчитайте размер буфера в байтах, чтобы решить проблему:

buffer_size = len(vektoren) * vektoren.itemsize
OpenGL.GL.glBufferData(OpenGL.GL.GL_ARRAY_BUFFER, buffer_size, vektoren, OpenGL.GL.GL_STATIC_DRAW)

Обратите внимание: массив может быть передан в glBufferData без явного определения размера:

OpenGL.GL.glBufferData(OpenGL.GL.GL_ARRAY_BUFFER, vektoren, OpenGL.GL.GL_STATIC_DRAW)
  • 0
    Спасибо большое! Это наконец работает :).
  • 0
    @Rimibald Не за что

Ещё вопросы

Сообщество Overcoder
Наверх
Меню