我试图在游戏代码中不再使用glVertex(),因为它似乎不能很好地处理大量的顶点。目前,我正在尝试编写使用Shaders的代码,但是在用shaders.compileProgram编译时,它给出了标题中显示的错误,但没有解释哪里出了问题。
目前为止的代码:
import OpenGL
from OpenGL.GL import *
from OpenGL.GL import shaders
from OpenGL.arrays import vbo
import math
import pygame
from pygame.locals import *
VERTEX_SHADER = shaders.compileShader("""
#version 120
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
""", GL_VERTEX_SHADER)
FRAGMENT_SHADER = shaders.compileShader("""
#version 120
void main() {
gl_FragColor = vec4( 0, 1, 0, 1 );
}
""", GL_FRAGMENT_SHADER)
self.shader = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
完整的错误消息:
Traceback (most recent call last):
File "PyOpenGl shader test from scratch.py", line 24, in <module>
self.shader = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
File "/home/[my name]/.local/lib/python2.7/site-packages/OpenGL /GL/shaders.py", line 196, in compileProgram
program.check_validate()
File "/home/[my name]/.local/lib/python2.7/site-packages/OpenGL/GL/shaders.py", line 108, in check_validate
glGetProgramInfoLog( self ),
RuntimeError: Validation failure (0):
有什么需要我补充的线来告诉我出了什么问题吗?
发布于 2019-01-09 11:33:26
如果在编译着色器之前不指定上下文,也经常会发生这种情况。例如,对于QT (pytqt),在启用gl上下文(例如在initializeGL
函数中)时,应该编译着色器。因此,在使用QT的情况下,您可以执行如下操作:
class MyQtWidget(QOpenGLWidget, QWidget):
def __init__(self, directory):
super(MyQtWidget, self).__init__()
...
def initializeGL(self):
"""
Initializes openGL context and scenery
"""
self.shader = compileProgram(
compileShader(my_vert_shader, gl.GL_VERTEX_SHADER),
compileShader(my_frag_shader, gl.GL_FRAGMENT_SHADER)
)
至于你的个案,请参阅这里的例子:
https://github.com/tartley/opengl-tutorials/blob/master/pyopengl/05-lighting.py
着色器是在上下文启用后编译的(通过继承BaseContext类)。
另一个使用glfw的示例还预先初始化了上下文:
https://github.com/totex/PyOpenGL_教程/blob/master/main.py
在这里我们有一个glfw.make_context_current
函数。
然而,即使您这样做,这并不意味着您的着色器是正确的,但如果您确实不完善的上下文,您应该得到详细的错误消息,您的着色器是什么问题。
发布于 2018-07-20 17:46:39
事实上,我完全忽略了这一事实,即本教程专门为本教程使用了一个特殊的库。(我讨厌一个导师这样做.在没有教程模块的情况下,我该怎么做?)
问题似乎并不在于着色器,我只是从继承的类中丢失了函数。
https://gamedev.stackexchange.com/questions/161831
复制相似问题