问题描述
我想从一个物体(在我的情况下是球体,上面是一个带有手柄和球体的杆子)上吸引一些光。
光线也应该吸引其他物体,但正如我所提到的,它只能来自唯一的球体。
目前,我只获得环境光。
我将L键设置为显示闪电,但是当我按下该键时,它仅显示环境光(使场景变暗)。
这是代码
/// Lights
float ambientLight[4] = { 0.35f,0.35f,1.0f }; // colour
float ambientLightOff[4] = { 0.0f,0.0f,1.0f }; // colour
float sunLightPos[4] = { 6.f,15.5f,5.0f,0.0f }; // distant above
float sunLightDif[4] = { 0.8f,0.8f,0.8f };
float sunLightSpec[4] = { 0.8f,0.8f }; // colour
float sunLightAmb[4] = { 0.1f,0.1f,0.0f }; // colour
// materials
float wooddif1[] = { 0.647059f,0.164706f,1.0f };
float woodamb1[] = { 0.41f,1.0f };
float woodspe1[] = { 0.547059f,0.364706f,0.264706f,1.0f };
float woodshiny1 = 60;
bool shownormals = TRUE;
bool lighting = false;
bool texture = false;
bool ambientlighting = true;
bool sunlighting = false;
bool buildinglighting = false;
static GLfloat lightIntensity = 0.5;
bool whereLights = true;
void drawpole()
{
glColor3f(0.5f,0.05f);
glTranslatef(0,1,0);
drawCylinder3();
glColor3f(0.5f,0);
drawCylinder3();
glPushmatrix();
//glTranslatef(light2Pos[0],light2Pos[2]);
//glTranslatef(25,13);
glColor3f(0.3,0.4,0.1);
if (lighting) { setMaterial(4); }
drawSphere();
glPopMatrix();
}
void setLights()
{
if (lighting)
{
glEnable(GL_LIGHTING);
glEnable(GL_norMALIZE);
//setShademodel();
}
else gldisable(GL_LIGHTING);
if (sunlighting)
{
}
else gldisable(GL_LIGHT0);
//if (buildinglighting)
if (ambientlighting)
{
}
else
{
}
}
void drawLightPlaces()
{
//draw the lights at position
gldisable(GL_LIGHTING);
if (lighting) glEnable(GL_LIGHTING);
}
编辑(与评论有关)。
void drawpole()
{
glColor3f(0.5f,0);
drawCylinder3();
glPushmatrix();
glColor3f(0.5f,0.05f);
if (buildinglighting) {
gldisable(GL_LIGHTING);
glColor3f(1.0,1.0,1.0);
setMaterial(4);
}
drawSphere();
glPopMatrix();
}
void setLights()
{
if (lighting)
{
glEnable(GL_LIGHTING);
}
else gldisable(GL_LIGHTING);
if (sunlighting)
{
sunlighting;
}
else gldisable(GL_LIGHT0);
if (buildinglighting)
{
// glLightfv(GL_LIGHT0,GL_POSITION,light_position);
//gllightmodeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//glEnable(GL_DEPTH_TEST);
}
if (ambientlighting)
{
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_norMALIZE);
setShademodel();
//gldisable(GL_LIGHTING);
}
else
{
}
}
float wooddif1[] = { 0.647059f,1.0f };
float woodamb1[] = { 0.41f,1.0f };
float woodspe1[] = { 0.547059f,1.0f };
float woodshiny1 = 60;
void setMaterial(int m) // 1=plane 2= 3=ground 4=wood 5=roof 6=wood2 7=
{
if (m == 1)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,woodamb1);
glMaterialfv(GL_FRONT,GL_DIFFUSE,wooddif1);
glMaterialfv(GL_FRONT,GL_specular,woodspe1);
glMaterialf(GL_FRONT,GL_SHINInesS,woodshiny1);
}
if (m == 2) // 2
{
}
}
解决方法
一个疯狂的猜测:您的代码中(至少在发布的部分中)缺少glEnable(GL_LIGHT0)
。
以防万一,glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
可能对确保背面三角形点亮也很有用。
在那之后,应该对GL_SHININESS和GL_SPECULAR参数进行调整以获得这种突出显示。