gpt4 book ai didi

python - pyOpenGL 三角形没有被绘制

转载 作者:太空宇宙 更新时间:2023-11-03 21:42:21 25 4
gpt4 key购买 nike

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

最佳答案

第二个参数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)

关于python - pyOpenGL 三角形没有被绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com