来自物体的 Opengl 闪电
Posted
技术标签:
【中文标题】来自物体的 Opengl 闪电【英文标题】:Opengl Lightning from object 【发布时间】:2020-09-29 12:56:45 【问题描述】:我想从一个物体(在我的例子中是球体,它是一根杆子,顶部有一个手柄和球体)上绘制一些光。
光也应该在其他物体上绘制,但正如我提到的那样,来自唯一的球体。
目前,我只获得环境光。
我已将 L 键设置为显示闪电,但当我按下该键时它只显示环境光(使场景变暗)。
这里是代码
/// Lights
float ambientLight[4] = 0.35f, 0.35f, 0.35f, 1.0f ; // colour
float ambientLightOff[4] = 0.0f, 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,0.8f ;
float sunLightSpec[4] = 0.8f,0.8f,0.8f,0.8f ; // colour
float sunLightAmb[4] = 0.1f,0.1f,0.1f,0.0f ; // colour
// materials
float wooddif1[] = 0.647059f, 0.164706f, 0.164706f , 1.0f ;
float woodamb1[] = 0.41f, 0.164706f, 0.164706f, 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.35f, 0.05f);
glTranslatef(0, 1, 0);
drawCylinder3();
glColor3f(0.5f, 0.35f, 0.05f);
glTranslatef(0, 1, 0);
drawCylinder3();
glPushMatrix();
//glTranslatef(light2Pos[0],0, light2Pos[2]);
//glTranslatef(25, 0, 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.35f, 0.05f);
glTranslatef(0, 1, 0);
drawCylinder3();
glColor3f(0.5f, 0.35f, 0.05f);
glTranslatef(0, 1, 0);
drawCylinder3();
glPushMatrix();
glColor3f(0.5f, 0.35f, 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, 0.164706f, 0.164706f , 1.0f ;
float woodamb1[] = 0.41f, 0.164706f, 0.164706f, 1.0f ;
float woodspe1[] = 0.547059f, 0.364706f, 0.264706f, 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
【问题讨论】:
【参考方案1】:一个疯狂的猜测:您的代码中缺少glEnable(GL_LIGHT0)
(至少在发布的部分中)。
以防万一,glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
也可能有助于确保背面三角形被点亮。
之后,应该调整 GL_SHININESS 和 GL_SPECULAR 参数以获得这种高光。
【讨论】:
感谢您的回复,是的,这是缺失的,但现在我添加了它,它的显示光线但不像图片(仓库上方的光线顶点)..请指导我 GL光照模型有很多参数,其中包括fallofs。向我们展示您现在得到的图片,以便我们猜测参数。顺便说一句,setMaterial 代码会很有用。您可能错误地使用了“ambientLightOff”参数 glMaterialfv() 调用在哪里?它们的参数是什么。 这是视频...基本上我想在触发 B 按钮时添加一些灯光..它基本上是一个建筑灯功能..我想点亮它,让它看起来像它当环境光被激活时,从我添加为白色球体的极点发射。它有效,但不像我想要的图片。 我看过视频,它显然没有显示镜面高光(这是您想要的),因此为了进一步调查,需要 setMaterial 函数源以及光参数的确切用法以上是关于来自物体的 Opengl 闪电的主要内容,如果未能解决你的问题,请参考以下文章