Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[OpenGL] Конусный источник света

18K
29 мая 2006 года
DPP
1 / / 29.05.2006
Здравствуйте!

Пытаясь разобраться с источниками света сделал утрированную сцену: куча кубиков и источник света (над плоскостью кубиков):

Код:
// глобально
GLfloat light_Ka[]={.1, .1, .1, 1};
GLfloat light_Kd[]={.3, .3, .3, 1};
GLfloat light_Ks[]={.1, .1, .1, 1};
GLfloat light_model_Ka[]={.2, .2, .2, 1};
GLfloat pos_light[4]={10,4,10,1},
    dir_light[4]={0,-1,0,1};

GLfloat material_Ka[]={.5, .5, .5, 1};
GLfloat material_Kd[]={.4, .6, .8, 1};
GLfloat material_Ks[]={.5, .5, .5, 1};
GLfloat material_Ke[]={0, 0, 0, 1};
GLfloat material_Se=10;

GLuint list_cubes;

// в Init()
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_TEXTURE_2D);

    glEnable(GL_LIGHTING);
    glEnable(GL_NORMALIZE);

    int i=3;
    glEnable(GL_LIGHT0+i);
    glLightfv(GL_LIGHT0+i,GL_AMBIENT,light_Ka);
    glLightfv(GL_LIGHT0+i,GL_DIFFUSE,light_Kd);
    glLightfv(GL_LIGHT0+i,GL_SPECULAR,light_Ks);
    glLightf(GL_LIGHT0+i,GL_SPOT_CUTOFF,60);
    glLightf(GL_LIGHT0+i,GL_SPOT_EXPONENT,100);
    glLightfv(GL_LIGHT0+i,GL_POSITION,pos_light);
    glLightfv(GL_LIGHT0+i,GL_SPOT_DIRECTION,dir_light);

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_model_Ka);
    glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1);
    glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,1);

    glMaterialfv(GL_FRONT,GL_AMBIENT,material_Ka);
    glMaterialfv(GL_FRONT,GL_DIFFUSE,material_Kd);
    glMaterialfv(GL_FRONT,GL_SPECULAR,material_Ks);
    glMaterialfv(GL_FRONT,GL_EMISSION,material_Ke);
    glMaterialf(GL_FRONT,GL_SHININESS,material_Se);

// создаем кучу кубиков
    list_cubes=glGenLists(1);
    glNewList(list_cubes, GL_COMPILE);
    for(int y=0;y<200;y++){
    for(int x=0;x<200;x++){
        glutSolidCube(.1);
        glTranslatef(1,0,0);
    }
    glTranslatef(-200,0,0);
    glTranslatef(0,0,1);
    }
    glEndList();

// в Display() рисуем
    glPushMatrix();
    glTranslatef(-100,0,0);
    glTranslatef(0,0,-100);
    glTranslatef(0,1,0);
        glCallList(list_cubes);
    glPopMatrix();

Нужен конусный источник света.
Хочу увидеть, что несколько кубиков освещены, а остальные освещены еле-еле. т.е. хочу увидеть пятно света. Кубики насоздавал, чтоб быть уверенным что все нормали и пр. там где надо.

Помогите исправить.

В приложении есть полный файл light.cpp его нужно добавить в пустой консольный проект студии. Написан с использование glut.

Спасибо.
8.2K
01 июня 2006 года
Akela
64 / / 13.05.2005
Проще всего это сделать так: для источника света создать текстуру (например белый круг на черном фоне) и накладывать ее проекционно на объекты сцены.
Если есть возможность использовать шейдеры, то реализация очень проста. В противном случае все тоже не очень сложно, но прийдется помучаться с генерацией текстурных координат.
12K
02 июня 2006 года
leeb
32 / / 01.02.2006
Цитата:
Нужен конусный источник света.
Хочу увидеть, что несколько кубиков освещены, а остальные освещены еле-еле. т.е. хочу увидеть пятно света. Кубики насоздавал, чтоб быть уверенным что все нормали и пр. там где надо.


Есть второй вариант. Сцену нарисовать в 3DMax-е вместе с конусным источником света. Потом сгенерировать LightMap-ы и экспортировать сцену в какой-нибудь 3DS. Потом загрузить этот файл. И можно обойтиь без шейдеров.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог