3

これはhttp://pyopengl.sourceforge.net/context/tutorials/shader_1.xhtmlからの例です。

vbo を作成し、ビンジングし、シェーダーで実行していますが、途中で正しく動作しません。私はインターネットで多くのことを検索しましたが、私の問題に対する正確な答えは見つかりませんでした (私が持っていた最良の選択は、StackOverflow のこのトピックに関するものでした: Why is this tutorial example of a shader notdisplay any geometry as it should ?著者が同じチュートリアルに取り組んでいても、同じ問題は発生せず、自分で解決しました...)

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

それが何を意味するのか分かりますか?正確に言うと、私は 2 か月前に Python を学び始めたので、インターンシップ期間中に多くの作業をしなければならなかったとしても、かなりの初心者です。(ほら、それがStackOverflowに関する私の最初の質問です:)

4

2 に答える 2

1

いくつかのニュース!遅れて申し訳ありませんが、今週は学校の数学理論の巨大な部分に取り組まなければなりませんでした。

それで、Hugh Fisher に尋ねられたので、glut32.dll がインストールされている場所を確認しました。そして、それがインストールされていないことを知ったとき、なんと驚きました...どこにもありません! ということで、まず glut32.dll をダウンロードして c:\Windows\System32\ に置きましたが、うまくいかなかったので Windows\SysWOW64\ に置きました。そして...それは動作します!したがって、解決策は次のようになります。

  • glut32.dllの場所を見つけます(注意してください、System32ファイルにglu32.dllがありますが、同じではありません!)
  • そのようなファイルが存在しない場合は、ダウンロードします
  • 32 ビットの Windows を使用している場合は、ダウンロードした glut32.dll を c:\Windows\System32\ に配置します。
  • 64 ビット Windows の場合は c:\Windows\SysWOW64\ に配置します。

解決策を提供してくれた Hugh Fisher に感謝します。

于 2013-06-18T10:19:51.153 に答える