В данный момент я застрял, пытаясь обновить одинаковые значения вершинного и фрагментного шейдеров.К сожалению, как только я вызываю glDrawElements, я больше не могу получить доступ к этим значениям.Так что я могу установить их только при инициализации, а потом уже никогда.Это выглядит как в этом потоке, но переустановка PyOpenGl не сработала ( MODERN OPENGL не может изменить одинаковое значение между вызовами glDrawArrays ).Буду признателен за любую помощь.
def Video_setupGL():
#Set ViewPort
glViewport(0, 0, 640, 480)
####################
vertices2 = [
0.0, 0.5, -0.5,
0.5, -0.5, -0.5,
-0.5, -0.5, -0.5
]
#####################
vertexShaderSource2 = textwrap.dedent("""#version 330
in vec3 position;
uniform mat4 transform;
void main() { gl_Position = transform * vec4(position, 1.0f); }\
""")
vertexShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertexShader, vertexShaderSource2)
glCompileShader(vertexShader)
#check if compilation was successful
ret = glGetShaderiv(vertexShader, GL_COMPILE_STATUS)
if not ret:
raise Exception("failed to compile vertex shader")
fragmentSource2 = textwrap.dedent("""#version 330
uniform vec4 ourColor;
void main()
{
##gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
gl_FragColor = ourColor;
}\
""")
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(fragmentShader, fragmentSource2)
glCompileShader(fragmentShader)
ret = glGetShaderiv(fragmentShader, GL_COMPILE_STATUS)
if not ret:
raise Exception("failed to compile fragment shader. Code = " + str(ret))
shaderProgram = glCreateProgram()
glAttachShader(shaderProgram, vertexShader)
glAttachShader(shaderProgram, fragmentShader)
glLinkProgram(shaderProgram)
ret = glGetProgramiv(shaderProgram, GL_LINK_STATUS)
if not ret:
raise Exception("failed to link shader program. Code = " + str(ret))
#################################
#1. Init VBO
vertexBuffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer)
glBufferData(GL_ARRAY_BUFFER, np.array(vertices, dtype="float32"), GL_STATIC_DRAW)
#1.2 Init EBO
indices = [0, 1, 3, 1, 2, 3]
ebo = glGenBuffers(1)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, np.array(indices, dtype="int32"), GL_STATIC_DRAW)
#################################
#2. Init VAO
vertexArrayObject = glGenVertexArrays(1)
glBindVertexArray(vertexArrayObject)
#################################
position = glGetAttribLocation(shaderProgram, 'position')
glEnableVertexAttribArray(position)
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 3*sizeof(c_float), ctypes.c_void_p(0)) # stride is maybe wrongly set
glEnableVertexAttribArray(0)
glBindVertexArray(0)
glDisableVertexAttribArray(position)
glBindBuffer(GL_ARRAY_BUFFER, 0)
########################
state = [shaderProgram, vertexArrayObject, ebo]
return state
def Video_paintGL(state, posMatrix, i, color):
######posMatrix, i and color are changed everytime Video_paintGL ist executed
shaderProgram, vertexArrayObject, myEbo = state
##############
glClearColor(0.2, 0.2, 0.2, 1.0)
glClear(GL_COLOR_BUFFER_BIT)
glLoadIdentity()
glUseProgram(shaderProgram)
################
transformLoc = glGetUniformLocation(shaderProgram, "transform")
if transformLoc == -1:
raise Exception("Transform Uniform could not be found")
print("Error: " + str(glGetError()))
posMatrix = getRotMatrix(np.array([0,0,1], dtype="float32"), np.pi/4 * (i+1)) #get a rotated identiy matrix around the z axis
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, posMatrix) ###this function makes me sick
colorLoc = glGetUniformLocation(shaderProgram, "ourColor")
print(color)
glUniform4f(colorLoc, color[0], color[1], color[2], 1.0) #this as well
glBindVertexArray(vertexArrayObject)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, myEbo)
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, None)
glBindVertexArray(0)
glUseProgram(0)