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,您可以给它们更合适的名称,它们现在是您程序的本地名称。这就是我想要做的。谢谢你快速清晰的回答。