这是来自http://pyopengl.sourceforge.net/context/tutorials/shader_1.xhtml
的示例它正在创建一个vbo,将它绑定并使用着色器运行它,但是在某个地方,它无法正常工作。我在互联网上搜索了很多,并没有找到我的问题的任何确切答案(我在StackOverflow上的最佳选择是Why is this tutorial example of a shader not displaying any geometry as it is supposed to?,但即使作者正在研究相同的教程,他也没有没有同样的问题并由他自己解决......)
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上的第一个问题:)
答案 0 :(得分:3)
由于您没有安装GLUT,因此失败了。
GLUT是GL Utility Toolkit,一个非常广泛使用的简单框架,用于创建在MS Windows,Mac,Linux,SGI上运行的OpenGL程序......所有函数和常量都有过剩或GLUT_前缀,而且glutInitDisplayMode是通常是第一个被调用的函数。
[删除安装说明]
好的,你已经完成了安装但仍然无法正常工作。这意味着当您安装了GLUT时,Python程序无法加载GLUT DLL。动态链接,哦快乐。
找到安装了glut32.dll的地方。
单个程序的快速而肮脏的解决方案是将glut DLL复制到与程序本身相同的目录中。
GLUT是32位(AFAIK,除非你自己构建),如果你有64位版本的Windows 7,这可能会很棘手。网上的建议是,在64位Windows上,32位DLL应该在C中: \ Windows \ SysWoW64 \和C:\ Windows \ System32 \
中的64位DLL(说真的。我没有错误地交换过两个目录名。)
如果这不起作用,我就没有想法了。
答案 1 :(得分:1)
一些新闻!对于延迟感到抱歉,本周必须为学校的大量数学理论工作。
所以,正如Hugh Fisher问我的那样,我检查了glut32.dll的安装位置。当我发现它没有安装在任何地方时,真是一个惊喜!所以我首先下载了glut32.dll并将其放入c:\ Windows \ System32 \但是,由于它不起作用,我将它放入Windows \ SysWOW64 \中。而且......它有效!所以解决方案似乎是:
感谢Hugh Fisher的解决方案。