2013-11-25 46 views
0

我目前正在研究OpenGL(python)中的灯光,我有一个想法,并有这个想法一个问题和一个问题。用类构造函数创建opengl灯

因为我正在阅读文档here。我有一个想法,如果我可以编写一个class(构造函数)来创建灯光作为将所有输入参数(属性)设置为默认(由我定义)的对象,但是如果在创建新灯光对象时定义了它们,我可以覆盖它们。该Light类应该是这样的:

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) 

的问题如下: 如果可以做到这一点(这样)我有一个如何使表达GL_LIGHTi的正确形式的文档here中存在的问题它是在Notes中说:

这是每次都这样

GL_LIGHTi = GL_LIGHT0+i 

那么有没有写这个办法正确(蟒蛇)类或这是一个坏主意(是可能的)? glEnable()接受什么类型的输入,因为我知道它可以与glEnable(GL_LIGHT0)一起使用,但如果i=0不接受glEnable(str(GL_LIGHT)+str(i))

正如我所看到的,如果您可能已经创建/定义了8个灯光及其所有参数,那么代码会稍微短一些。

回答

1

OpenGL是一个状态机。在构造函数中设置状态是没有意义的,因为下次初始化灯时,它将被构造函数覆盖。你也不会在(固定功能)OpenGL中获得无限数量的灯光。

你想是这样的:

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) 
+0

这就是我想要做的。感谢您提供快速和明确的答案。 – avstenit

1

首先,为什么不在这里使用着色器,而是固定管道?除非你的目标是一个非常古老的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()

+0

我很新的'OpenGL'这种方式似乎(好像)我的正确方法。关于我想知道的着色器,如果我没有记错,着色器程序必须用'C(C++)'写成,还是用'python'写成? 如果我理解正确,你建议我在我的'class'(构造函数)中预定义这个值'GL_LIGHTi = 0x400i'? 感谢您的快速和有用的答案。 – avstenit

+0

着色器是用单独的语言编写的,对于OpenGL它称为GLSL。它具有类C语法,并且在互联网上有很多教程。可以从不同的文本文件加载,或者在你的源代码中作为字符串硬编码 - 这取决于你,但第一个是非常明智的;)对于解决方案,我预先定义它为'GL_LIGHTi = 0x4000 + i'因为我可以比9大,你可以给他们更合适的名字,他们现在是你的程序的本地。 – Tomcatus