这是一个示例: http: //pyopengl.sourceforge.net/context/tutorials/shader_1.xhtml
它正在创建一个 vbo,对其进行绑定,并使用着色器运行它,但在此过程中,它无法正常工作。我在互联网上进行了很多搜索,但没有找到任何关于我的问题的准确答案(我在 StackOverflow 上获得的最佳选择是关于这个主题的:为什么这个着色器的教程示例没有按预期显示任何几何图形?但是即使作者在做同一个教程,他也没有遇到同样的问题并自己解决了......)
from OpenGLContext import testingcontext
BaseContext = testingcontext.getInteractive()
from OpenGL.GL import *
from OpenGL.arrays import vbo
from OpenGLContext.arrays import *
from OpenGL.GL import shaders
class TestContext( BaseContext ):
def OnInit( self ):
VERTEX_SHADER = shaders.compileShader("""#version 330
void main() {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}""", GL_VERTEX_SHADER)
FRAGMENT_SHADER = shaders.compileShader("""#version 330
void main() {
gl_FragColor = vec4( 0, 3, 6, 1 );
}""", GL_FRAGMENT_SHADER)
self.shader = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER)
self.vbo = vbo.VBO(
array( [
[ 0, 1, 0 ],
[ -1,-1, 0 ],
[ 1,-1, 0 ],
[ 2,-1, 0 ],
[ 4,-1, 0 ],
[ 4, 1, 0 ],
[ 2,-1, 0 ],
[ 4, 1, 0 ],
[ 2, 1, 0 ],
],'f')
)
def Render( self, mode):
shaders.glUseProgram(self.shader)
try:
self.vbo.bind()
try:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointerf(self.vbo)
glDrawArrays(GL_TRIANGLES, 0, 9)
finally:
self.vbo.unbind()
glDisableClientState(GL_VERTEX_ARRAY);
finally:
shaders.glUseProgram(0)
if __name__ == "__main__":
TestContext.ContextMainLoop()
从 windows 命令行运行这个程序会给我这个错误:
Traceback(most recent call last):
File "openGL-test.py', line 70, in <module>
TestContext.ContextMainLoop()
File "C:\Python27\lib\site-package\openglcontext-2.2.0a2-py2.7.egg\OpenGLContext\glutcontext.py", line 159, in ContextMainLoop
render = cls( *args, **named)
File "C:\Python27\lib\site-package\openglcontext-2.2.0a2-py2.7.egg\OpenGLContext\glutcontext.py", line 35, in __init__
glutInitDisplayMode( self.DISPLAYMODE )
File "C:\Python27\lib\site-package\OpenGL\platform\baseplatform.py", line 384, in __call__
self.__name__, self.__name__,
OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInitDisplayMode, check for bool(glutInitDisplayMode) before calling
知道这意味着什么吗?我必须准确地说,我两个月前开始学习 Python,所以我还是个新手,即使我在实习期间不得不做很多工作。(嗬,这是我在 StackOverflow 上的第一个问题 :)