2011-04-14 72 views
0

我正在试图在openGL中的一个台球桌上做'聚光灯'。这应该相当简单,但有些事情出错了,我无法弄清楚什么。OpenGL射灯

我有一个班级'PoolLight',我用它作为灯光的一种控制类。这里是:

#include "PoolLight.h" 
#include "Glut/glut.h" 
#include "GL/gl.h" 
#include "GL/glu.h" 

PoolLight::PoolLight() { 

} 

PoolLight::PoolLight(GLenum lightNumber, GLenum lightType, float red, float green, float blue, bool distant, float posX, float posY, float posZ) 
{ 
    this->lightNumber = lightNumber; 
    this->lightType = lightType; 

    color[0] = red; color[1] = green; color[2] = blue; color[3] = 1; 
    position[0] = posX; position[1] = posY; position[2] = posZ; position[3] = (int) (!distant); 
    glLightfv(lightNumber, lightType, color); 
    glLightfv(lightNumber, GL_POSITION, position); 

    enabled(true); 
} 


PoolLight::~PoolLight(void) 
{ 
} 

void PoolLight::setSpotlight(float angle, float attenuation, float dirX, float dirY, float dirZ) { 
    glLightf(lightNumber, GL_SPOT_EXPONENT, angle); 
    glLightf(lightNumber, GL_CONSTANT_ATTENUATION, attenuation); 
    glLightf(lightNumber, GL_LINEAR_ATTENUATION, 0.0f); 
    glLightf(lightNumber, GL_QUADRATIC_ATTENUATION, 0.0f); 
    spotDirection[0] = dirX; spotDirection[1] = dirY; spotDirection[2] = dirZ; 
    glLightfv(lightNumber, GL_SPOT_DIRECTION, spotDirection); 
    glLightf(lightNumber, GL_SPOT_CUTOFF, 60); 
} 

void PoolLight::enabled(bool enabled) { 
    if (enabled) glEnable(lightNumber); 
    else glDisable(lightNumber); 
} 

void PoolLight::reposition() { 
    glLightfv(lightNumber, GL_POSITION, position); 
} 

而且在显示::初始化,我有这样的代码:

glEnable(GL_TEXTURE_2D); 
glEnable(GL_DEPTH_TEST); 
glEnable(GL_LIGHTING); 
glPointSize(6); 

//Lighting 
middleSpotlight = PoolLight(GL_LIGHT0, GL_DIFFUSE, .3, .3, 0.15, false, 0, 0, 50); 
middleSpotlight.setSpotlight(60, 1, 0, 0, -1); 
upperSpotlight = PoolLight(GL_LIGHT1, GL_DIFFUSE, .3, .3, 0.15, false, 0, 45, 50); 
upperSpotlight.setSpotlight(60, 1, 0, 0, -1); 
lowerSpotlight = PoolLight(GL_LIGHT2, GL_DIFFUSE, .3, .3, 0.15, false, 0, -45, 50); 
lowerSpotlight.setSpotlight(60, 1, 0, 0, -1); 

但是,禁用所有,但中间的聚光灯我的场景均匀带有几分“点燃即使毯子'照明。

我觉得我可能错过了一些明显的东西,但我只是看不到。

+0

是否以弧度指定角度?用'60'作为你的角度,好像你在使用度数。 – ChrisF 2011-04-14 08:44:50

+0

我改成了(60.0 *(3.1415/180)),但无济于事。 – Xenoprimate 2011-04-14 08:58:10

+0

嗯,我现在想不出别的什么 - 对不起。 – ChrisF 2011-04-14 09:01:19

回答

1

这是由于OpenGL默认的固定功能管道如何实现光照:仅在顶点处计算光照,在表面上插值生成的颜色。如果你的整个桌子只有一个大的四边形,就会发生这种情况。

解决方案1:高度细分网格。

解决方案2:将固定功能照明替换为每个碎片照明着色器。

+0

网格已经在20个三角形中,但我只是将它制成了200,没有区别。我必须使用固定功能照明(这是一门课程),现在我没有时间学习其他方法。 :<你想要一个截图吗? – Xenoprimate 2011-04-14 09:00:09

+1

是的,请提供一些截图,还有一些代码显示如何绘制网格。 – datenwolf 2011-04-14 10:36:31