pyOpenGL三角形未绘制

时间:2018-10-11 12:19:58

标签: python opengl glfw

我刚刚开始学习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);
}

1 个答案:

答案 0 :(得分: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)