PyOpenGL - 关于不起作用的着色器的教程

时间:2013-06-12 23:39:37

标签: python-2.7 shader glut pyopengl

这是来自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上的第一个问题:)

2 个答案:

答案 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 \中。而且......它有效!所以解决方案似乎是:

  • 找到glut32.dll的位置(注意,System32文件中有一个glu32.dll,不一样!)
  • 如果不存在此类文件,download it
  • 将下载的glut32.dll放入c:\ Windows \ System32 \,如果你有32位Windows
  • 将其放入c:\ Windows \ SysWOW64 \,如果是64位Windows

感谢Hugh Fisher的解决方案。