2014-09-25 149 views
0

我在创建一个不错的聚光灯时遇到了一些麻烦。到目前为止,我的照明性能是这样的:OpenGL + GLUT聚光灯

/* Spot light */ 
glEnable(GL_LIGHT1); 
GLfloat ambientColor[] = {0.0f, 0.0f, 0.0f, 1.0f}; 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor); 

//Light 
GLfloat lightColor0[] = {0.7f, 0.7f, 0.7f,0.0f}; 
GLfloat lightPos0[] = {0.0f, 3.0f, 0.8f, 0.0}; 
glLightfv(GL_LIGHT1, GL_SPECULAR, lightColor0); 
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightColor0); 
glLightfv(GL_LIGHT1, GL_POSITION, lightPos0); 

glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 15.0); 
GLfloat spot_direction[] = { 0.0, -1.0, 0.0 }; 
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction); 
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0); 
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 2.0); 

我得到了各种各样的“聚光灯” ......至少,它是坐在我上面的场景照下来的物体光,但它没有(据我所知)出现在一个圆锥形的方式。
这是一幕我试图创建

Target Scene

这里是我到目前为止了。 Result so far
我知道我的纹理也有一点buggered,如果有人可以帮助,那太棒了!

+0

你的场景有多大?如果截止日期如此之大? – 2014-09-25 06:56:17

+0

如何定义场景大小?不是截止值聚光锥的半径角度? – Finn 2014-09-25 07:36:41

+0

你应该知道你的元素的位置,很可能。截止值是角度值...也许如果您将光线移动到较低位置或减少截止值,您将获得理想的效果。 – 2014-09-25 07:42:41

回答

2

您的解决方案是在这里

C++ Opengl - lighting using spotlight

你需要的位置变量的最后一个值是1.0的光成为一个聚光灯。

+0

此外,它可能是这种方式,因为实现聚光灯可能需要[齐次坐标](http://en.wikipedia.org/wiki/Homogeneous_coordinates)。 – 2014-10-01 19:59:21