将数据传递给顶点着色器时遇到问题。 当我尝试将数据传递给顶点着色器时,它根本就不会传递。
我的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。此代码已更改,以便不包含大量源代码文件,因此可能存在一些实际上不存在的错误。