C++ Opengl - 使用聚光灯照明

Posted

技术标签:

【中文标题】C++ Opengl - 使用聚光灯照明【英文标题】:C++ Opengl - lighting using spotlight 【发布时间】:2012-12-15 15:07:17 【问题描述】:

我有一个模型需要在聚光灯/定向光下,

意思是,我需要在模式(聚光灯和定向)之间切换。

这里有一些解释的代码:

我可以通过鼠标移动来旋转模型/光源,所以我正在使用

glRotate 和 glTranslate 。

一旦用户按下“L”键,我就应该在模式之间切换。

这是闪电的代码:

void LightBall::projectLight(void)

if(LIGHT == _lightMode)
    printf("Entering LIGHT mode\n"); <--- Supposed to be a directional light
    glDisable(GL_LIGHT1);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, _light_position);


if(SPOT_LIGHT == _lightMode)
    printf("Entering SPOTLIGHT mode\n"); <--- Supposed to be a spotlight
    glDisable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
    glLightfv(GL_LIGHT1, GL_POSITION, _light_position);
    glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 10.0);
    glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0);
    glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,_spotlight_position);


问题是我在它们之间切换时总是得到相同的灯光模式,

如下:

另一个例子是在两种光模式之间切换后仍然获得相同的光

带光源旋转的源(小球):

我怎样才能得到想要的结果?

以下是 LIGHT0 和 LIGHT1 的定义:

    GLfloat light_ambient[] =  1.0, 0.0, 0.0, 1.0 ;
GLfloat light_diffuse[] =  1.0, 0.0, 0.0, 1.0 ;
GLfloat light_specular[] =  1.0, 1.0, 1.0, 1.0 ;
_light_position[0] =  0.0;
_light_position[1] = 1.0;
_light_position[2] = 0.0;
_light_position[3] = 0.0;

_spotlight_position[0] = 0.0;
_spotlight_position[1] = -1.0;
_spotlight_position[2] = 0.0;

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);

谢谢!

【问题讨论】:

【参考方案1】:

GL 灯是定向灯还是聚光灯取决于其位置的 w(第 4 个)分量。如果坐标为 0,则它是有方向的。如果非零(通常为 1),则为聚光灯。在调用 glLightfv(..., GL_POSITION, ...) 之前,您必须相应地修改 _lightPosition

【讨论】:

以上是关于C++ Opengl - 使用聚光灯照明的主要内容,如果未能解决你的问题,请参考以下文章

昂宝OB3635AMPOB33398MP大功率投光灯80W驱动照明

RT7304GE隔离大功率50-100W路灯/投光灯照明驱动

在我的 OpenGL C++ 项目中究竟应该在哪里添加我的 BMP 文件?在 Mac 上使用 Xcode

照明基础知识——荧光灯(气体放电光源)发展史&工作原理

OpenGL + GLUT 聚光灯

BP2329AJ+BP5619非隔离T8/T5日光灯电源驱动照明