#opengl #opengl-compat #lightning
#opengl #opengl-compat #молния
Вопрос:
Я хочу нарисовать немного света от объекта (сфера в моем случае, это столб с ручкой и сфера сверху).
Свет должен падать и на другие объекты, но из единственной сферы, как я уже упоминал.
В настоящее время я получаю только окружающий свет.
Я установил клавишу 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 должны быть изменены, чтобы получить такие блики.
Комментарии:
1. Спасибо за ответ, да, этого не хватало, но теперь я добавил к нему, и он показывает свет, но не такой, как на картинке (вершина света проходит над складом) .. направьте меня, пожалуйста
2. Модель GL light имеет ряд параметров, среди которых есть fallofs. Покажите нам картинку, которую вы получаете прямо сейчас, чтобы мы могли угадать параметры. Кстати, код setMaterial был бы полезен. Возможно, вы неправильно используете параметры ambientLightOff
3. Где находятся вызовы glMaterialfv() ? И каковы их параметры.
4. Вот видео … в основном я хотел добавить несколько источников света при запуске B button..it в основном это функция освещения здания .. я хочу осветить его так, чтобы казалось, что он излучает от столба, который я добавил в виде белой сферы, когда активируется рассеянный свет. это работает, но не так, как я хотел на картинке.
5. Я видел видео, и оно, очевидно, не показывает зеркальных бликов (что вам и нужно), поэтому для дальнейшего изучения необходим источник функции setMaterial и точное использование ваших параметров освещения