Vor kurzem habe ich festgestellt, das das Tutorial, mit dem ich versucht habe, OpenGL zu lernen, entsetzlich veraltet ist und ich bin deswegen auf das englische Wikibook umgeschwenkt, was ja angeblich "modernes" OpenGL nutzt. Und da braucht man angeblich für vieles einen Shader. Und dieser bereitet mir Probleme.
Ich will im Moment das C++-Programm aus diesem Teil nach Python übersetzen und dabei kriege ich eine seeehr lange Fehlermeldung.
Mein Quellcode:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from sys import exit
import pygame
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
class Szene:
def __init__(self):
self.laeuft = True
self.dreieck_punkte = [
0.0, 0.8,
-0.8, -0.8,
0.8, -0.8
]
self.init_grafik()
def init_grafik(self):
pygame.init()
self.screen = pygame.display.set_mode((800, 450), pygame.OPENGL)
glutInit()
self.init_shader()
# der vermutlich fehlerhafte Teil
def init_shader(self):
self.shaders = dict()
self.shaders["vertex"] = glCreateShader(GL_VERTEX_SHADER)
vertex_shader_source = [
"#version 440",
"attribute vec2 coord2d;",
"void main (void) {",
" gl_Position = vec4(coord3d, 0.0, 1.0);"
"}"
]
glShaderSource(self.shaders["vertex"], 1, vertex_shader_source, None)
glCompileShader()
def hauptschleife(self):
while self.laeuft:
for event in pygame.event.get():
self.verarbeite_event(event)
self.aktualisiere()
glFlush()
pygame.display.flip()
exit()
def verarbeite_event(self, event):
self.laeuft = not ((event.type == pygame.QUIT) or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE))
def aktualisiere(self):
pass
if __name__ == '__main__':
szene = Szene()
szene.hauptschleife()
Code: Alles auswählen
Traceback (most recent call last):
File "c:\python34\lib\site-packages\OpenGL\latebind.py", line 41, in __call__
return self._finalCall( *args, **named )
TypeError: 'NoneType' object is not callable
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Roman\Documents\ogl-test.py", line 58, in <module>
szene = Szene()
File "C:\Users\Roman\Documents\ogl-test.py", line 20, in __init__
self.init_grafik()
File "C:\Users\Roman\Documents\ogl-test.py", line 26, in init_grafik
self.init_shader()
File "C:\Users\Roman\Documents\ogl-test.py", line 38, in init_shader
glShaderSource(self.shaders["vertex"], 1, vertex_shader_source, None)
File "c:\python34\lib\site-packages\OpenGL\latebind.py", line 45, in __call__
return self._finalCall( *args, **named )
File "c:\python34\lib\site-packages\OpenGL\wrapper.py", line 579, in wrapperCall
pyArgs = tuple( calculate_pyArgs( args ))
File "c:\python34\lib\site-packages\OpenGL\wrapper.py", line 436, in calculate_pyArgs
yield converter(args[index], self, args)
File "c:\python34\lib\site-packages\OpenGL\converters.py", line 305, in stringArray
value = [as_8_bit(x) for x in arg]
TypeError: ("'int' object is not iterable", <bound method StringLengths.stringArray of <OpenGL.converters.StringLengths object at 0x000000000312C550>>)
Falls es wichtig ist, ich benutze Python 3.4 x86_64, ein dazu passendes PyOpenGL 3.1 auf einem PC mit Win7 x86_64.
Danke und Lg Y.