无法使用pyopengl在顶点着色器中传递数据

时间:2014-01-23 22:05:06

标签: python opengl shader glfw pyopengl

将数据传递给顶点着色器时遇到问题。 当我尝试将数据传递给顶点着色器时,它根本就不会传递。

我的PC规格需要:

操作系统:Windows 8 64位

Python:2.7.6 64位

PyOpenGL:3.0.2 64位

NumPy:1.8.0 64位非官方(但不是问题的根源)

显卡:Radeon HD 8330

代码:

import sys
import os
import numpy
from math import sin, cos
from glfw import *
from OpenGL.GL import *

class App:
    def __init__(self):
        if not glfwInit():
            sys.exit()

        self.window = glfwCreateWindow(640, 480, "App", None, None)
        if not self.window:
            glfwTerminate()
            sys.exit()
        glfwMakeContextCurrent(self.window)

        glfwSetKeyCallback(self.window, self.onKey)

        vertexShaderSource = """
            #version 430 core

            layout (location = 0) in vec4 offset;

            void main(void) {
                const vec4 vertices[] = vec4[](
                    vec4( 0.25, -0.25, 0.5, 1.0),
                    vec4(-0.25, -0.25, 0.5, 1.0),
                    vec4( 0.25,  0.25, 0.5, 1.0));

                gl_Position = vertices[gl_VertexID] + offset;
            }
        """
        vertexShader = glCreateShader(GL_VERTEX_SHADER)
        glShaderSource(vertexShader, vertexShaderSource)
        glCompileShader(vertexShader)

        fragmentShaderSource = """
            #version 430 core

            out vec4 color;

            void main(void) {
                color = vec4(0.0, 0.8, 1.0, 1.0);
            }
        """
        fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
        glShaderSource(fragmentShader, fragmentShaderSource)
        glCompileShader(fragmentShader)

        self.program = glCreateProgram()
        glAttachShader(self.program, vertexShader)
        glAttachShader(self.program, fragmentShader)
        glLinkProgram(self.program)

        glDeleteShader(vertexShader)
        glDeleteShader(fragmentShader)
        self.vertexArray = glGenVertexArrays(1)
        glBindVertexArray(self.vertexArray)

    def onKey(self, window, key, scancode, action, mods):
        if key == GLFW_KEY_ESCAPE and action == GLFW_PRESS:
            glfwSetWindowShouldClose(window, 1)

    def run(self):
        # render part
        while not glfwWindowShouldClose(self.window):
            self.render(glfwGetTime())
            glfwSwapBuffers(self.window)
            glfwPollEvents()

        # cleanup actions
        glDeleteVertexArrays(1, (self.vertexArray,))
        glDeleteProgram(self.program)
        glfwTerminate()

    def render(self, currentTime):
        color = 0.0, 0.25, 0.0, 1.0
        glClearBufferfv(GL_COLOR, 0, color)
        glUseProgram(self.program)
        offset = numpy.array((sin(currentTime) * 0.5, cos(currentTime) * 0.6, 0.0, 0.0), dtype = numpy.float32)
        #glVertexAttrib4fv(0, offset)
        glDrawArrays(GL_TRIANGLES, 0, 3)

if __name__ == '__main__':
    app = App()
    app.run()

我尝试将Python语法用于数组(列表和元组)定义,但它没有帮助,因此我将此示例更改为使用NumPy包(因此NumPy不能成为问题的根源)。经过大量工具调试后(我有AMD平台所以我尝试了所有用于GPU调试的AMD调试软件+ https://www.opengl.org/wiki/Debugging_Tools上提到的所有软件),我没有结果。我无法确定问题的来源。调试软件无法显示传递给顶点着色器的数据。但是从我两天的实验中我得到的数据根本没有传递给着色器。据我所知,问题在于glVertexAttrib4fv函数。我试图在PyCharm中调试这个函数(当我尝试使用Python语法进行数组定义时会出错:例如我得到(数组)而不是数组,但是当我使用NumPy时我没有得到错误)。我不知道发生了什么,所以我问这个问题,如果您需要更多信息,请询问。

P.S。此代码已更改,以便不包含大量源代码文件,因此可能存在一些实际上不存在的错误。

0 个答案:

没有答案