3

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

4

2 回答 2

4

它失败了,因为您没有安装 GLUT。

GLUT 是 GL Utility Toolkit,一个非常广泛使用的简单框架,用于创建在 MS Windows、Mac、Linux、SGI 上运行的 OpenGL 程序......所有函数和常量都有一个 glut 或 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

(说真的。我没有错误地交换两个目录名。)

如果这不起作用,我没有想法。

于 2013-06-13T01:03:34.013 回答
1

一些新闻 !抱歉耽搁了,这周不得不为学校研究一个巨大的数学理论。

因此,正如 Hugh Fisher 所问,我检查了 glut32.dll 的安装位置。当我发现它没有安装在任何地方时,真是令人惊讶!所以我首先下载了 glut32.dll 并将其放入 c:\Windows\System32\,但由于它不起作用,我将其放入 Windows\SysWOW64\。而且......它的工作原理!所以解决方案似乎是:

  • 找到glut32.dll在哪里(注意,System32文件里有个glu32.dll,不一样!)
  • 如果不存在这样的文件,请下载
  • 如果您有 32 位 Windows,请将下载的 glut32.dll 放入 c:\Windows\System32\
  • 把它放在 c:\Windows\SysWOW64\ 如果是 64 位 Windows

感谢 Hugh Fisher 的解决方案。

于 2013-06-18T10:19:51.153 回答