Python 使用类构造函数创建opengl光源
我目前正在使用Python 使用类构造函数创建opengl光源,python,opengl,pyopengl,Python,Opengl,Pyopengl,我目前正在使用OpenGL(python)开发照明,我有一个想法,有了这个想法,我就有了一个问题 当我阅读文档时。如果我可以编写一个类(构造函数)来创建灯光作为对象,将所有输入参数(属性)设置为默认值(由我定义),但如果在创建新灯光对象时定义了,我可以覆盖它们,我就有了一个想法。灯类应如下所示: from OpenGL import * from OpenGL.GL import * from OpenGL.GLU import * from itertools import count cl
OpenGL
(python)开发照明,我有一个想法,有了这个想法,我就有了一个问题
当我阅读文档时。如果我可以编写一个类
(构造函数)来创建灯光作为对象,将所有输入参数(属性)设置为默认值(由我定义),但如果在创建新灯光对象时定义了,我可以覆盖它们,我就有了一个想法。灯
类应如下所示:
from OpenGL import *
from OpenGL.GL import *
from OpenGL.GLU import *
from itertools import count
class Light(object):
'''
classdocs
'''
_i = count()
def __init__(self, light_position):
'''
Constructor
'''
self.i = self._i.next()
self.light_position = light_position
glEnable(GL_LIGHTi)
glLightfv(GL_LIGHTi, GL_POSITION, self.light_position)
class Light:
...
setup(self, i):
glEnable(GL_LIGHT0 + i)
glLightfv(GL_LIGHT0 + 1, GL_POSITION, self.light_position)
....
问题如下:
如果可以(通过这种方式)做到这一点,我会遇到一个问题,那就是如何在文档中正确表达GL_LIGHTi
,注释中说:
情况总是这样
GL_LIGHTi = GL_LIGHT0+i
那么,有没有一种方法可以在(python)类中正确地编写此代码,或者这是一个坏主意(可能吗)?glEnable()
接受哪种类型的输入,因为我知道它与glEnable(GL\u LIGHT0)
一起工作,但不接受glEnable(str(GL\u LIGHT)+str(I))
如果I=0
在我看来,如果与创建/定义8个灯光及其所有参数相比,代码会稍微短一些。首先,为什么不在这里使用着色器,而使用固定管道?这是一种不受欢迎的舞台照明方式,除非您的目标是非常旧的OpenGL版本。这个问题只是出于好奇;)这并不能解决真正的问题 对我来说,它看起来像
glEnable()
接受字符串,但从定义来看,它们看起来不像“GL_LIGHT0”,而是
#define GL_LIGHT0 0x4000
#define GL_LIGHT1 0x4001
#define GL_LIGHT2 0x4002
#define GL_LIGHT3 0x4003
#define GL_LIGHT4 0x4004
#define GL_LIGHT5 0x4005
#define GL_LIGHT6 0x4006
#define GL_LIGHT7 0x4007
如gl.h标题所示。尝试为灯光提供一个合适的id,然后将其传递给glEnable()OpenGL是一个状态机。在构造函数中设置状态没有意义,因为下次初始化灯光时,它将被构造函数覆盖。此外,在(固定函数)OpenGL中也不会得到无限多的灯光 你想要这样的东西:
from OpenGL import *
from OpenGL.GL import *
from OpenGL.GLU import *
from itertools import count
class Light(object):
'''
classdocs
'''
_i = count()
def __init__(self, light_position):
'''
Constructor
'''
self.i = self._i.next()
self.light_position = light_position
glEnable(GL_LIGHTi)
glLightfv(GL_LIGHTi, GL_POSITION, self.light_position)
class Light:
...
setup(self, i):
glEnable(GL_LIGHT0 + i)
glLightfv(GL_LIGHT0 + 1, GL_POSITION, self.light_position)
....
在绘图功能中,类似于
glEnable(GL_LIGHTING)
for i,l in enumerate(lights):
l.setup(i)
我对
OpenGL
很陌生,这种方式对我来说似乎是正确的。关于着色器,如果我没记错的话,我想知道着色器程序必须用C(C++)
编写,或者用python
编写?如果我理解正确,您建议我在我的类
(构造函数)中预定义此值GL_LIGHTi=0x400i
?感谢您快速而有用的回答。着色器是用一种单独的语言编写的,对于OpenGL,它被称为GLSL。它有类似C语言的语法,互联网上有很多教程。可以从不同的文本文件加载,也可以在源代码中硬编码为字符串-这取决于您,但第一个是非常可取的;)对于解决方案,我将其预定义为GL_LIGHTi=0x4000+I
,因为我可以大于9,您可以给它们更合适的名称,它们现在是您程序的本地名称。这就是我想要做的。谢谢你快速清晰的回答。