Обновление Shader Uniform в OpenGL не работает - PullRequest
0 голосов
/ 13 октября 2018

В данный момент я застрял, пытаясь обновить одинаковые значения вершинного и фрагментного шейдеров.К сожалению, как только я вызываю 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)
...