Среда программирования:
Microsoft Visual C++2008 Express Edition
Статья по теме:
В этой работе выполняется освещение фигуры при помощи основных функций Open GL
Код программы:
#include <stdlib.h> // подключение библиотек #include <GL\glut.h> void look(); void square(){ // отстраивается одна грань кубика glBegin(GL_QUADS); glVertex3f(-1,-1,0); glVertex3f(1,-1,0); glVertex3f(1,1,0); glVertex3f(-1,1,0); glEnd(); glColor3b(0,0,0); glBegin(GL_LINES); glVertex3f(-0.4,1,0); glVertex3f(-0.4,-1,0); glVertex3f(0.4,-1,0); glVertex3f(0.4,1,0); glVertex3f(-1,0.4,0); glVertex3f(1,0.4,0); glVertex3f(-1,-0.4,0); glVertex3f(1,-0.4,0); glEnd(); } void cube(){ //glColor3ub(0xFF, 0x00, 0x00); //цвет грани (рисует три пары , с помощью смещения ) glPushMatrix(); glTranslatef(0, 0, -1); square(); //glColor3ub(0xFF, 0x00, 0x00); glTranslatef(0, 0, 2); square(); glPopMatrix(); //glColor3ub(0x0, 0xff, 0x00); glPushMatrix(); glRotatef(90, 0, 1, 0); glTranslatef(0, 0, -1); square(); glTranslatef(0, 0, 2); //glColor3ub(0x0, 0xff, 0x00); square(); glPopMatrix(); //glColor3ub(0x00, 0x00, 0xff); glPushMatrix(); glRotatef(90, 1, 0, 0); glTranslatef(0, 0, -1); square(); glTranslatef(0, 0, 2); //glColor3ub(0x00, 0x00, 0xff); square(); glPopMatrix(); } float cangle = 0.02; // угол вращения void onRender(){ glClearColor(100,0,1,0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //очистка буферов (двойного и глубины ) glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); look();// работа с освещением float l_diffuse[] = {0.4, 0.7, 0.2}; float l_pos[] = {-1.5, -1.5, 1.5, 1}; float s_dir[] = {1, 1, 0, -1}; glLightfv(GL_LIGHT0, GL_DIFFUSE, l_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, l_pos); glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.0); glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.2); glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.4); glPopMatrix(); glRotatef(cangle, 0, 0, 1); // поворот cube(); glutSwapBuffers(); // стандартная функция двойной буферизации , для измены буфера } void look(){ glMatrixMode(GL_MODELVIEW); gluLookAt(-4, -4, 2, // установление точки обзора 0, 0, 0, 0, 0, 1); } void onReshape(int w, int h){ //вызывается когда происходит изменение окна glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(120, w/h, 1, 100); // переключение на матрицу моделей look(); } void initScene(){ // создаёт глубину glEnable(GL_DEPTH_TEST); } int main(int argc, char **argv){ // стандартная функция glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); glutInitWindowPosition(100,100); //позиции glutInitWindowSize(500,500); //размер glutCreateWindow("Sqear"); //название initScene(); glutDisplayFunc( onRender); // функция отрисовки glutIdleFunc(onRender); //когда не событий glutReshapeFunc(onReshape); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glDisable(GL_CULL_FACE); glEnable(GL_LIGHTING); glutMainLoop(); //функция выполнения return 0; }
Комментарии
Ну..кажется что то пошло не так
http://pp.usera...