Форум программистов, компьютерный форум CyberForum.ru

OpenGL и материалы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
20.04.2012, 16:18     OpenGL и материалы #1
Здравствуйте. Есть программа:
Код
#include <GL/glut.h> 

static int kv= 1;
static int kd = 1;

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;

        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;

        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }

    glutPostRedisplay();
}


void display()
{

	glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glClear(GL_COLOR_BUFFER_BIT);
	
	glBegin(GL_POLYGON);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(150 - kv,300);
	glVertex2i(200, 250-kv);
	glVertex2i(300+kv, 300);
	glVertex2i(275, 350+kv);
	glVertex2i(200, 350+kv);
	glEnd();
	

	
	glBegin(GL_POLYGON);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(450-kd, 300);
	glColor3f(0.0, 1.0, 0.0);
	glVertex2i(500, 250-kd);
	glColor3f(1.0, 0.0, 1.0);
	glVertex2i(600, 250-kd);
	glColor3f(1.0, 1.0, 0.0);
	glVertex2i(610+kd,260);
	glColor3f(1.5, 0.5, 0);
	glVertex2i(575, 350+kd);
	glColor3f(0.0, 1.0, 1.0);
	glVertex2i(500, 350+kd);

	glEnd();
	
	glutSwapBuffers();
}



int main (int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowSize(800, 600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("Lab Darbs1");
	glutKeyboardFunc(key);
	glClearColor(1,1,1,1);
	
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	
	glutMainLoop();
	
	return 0;
}
И надо сделать так чтоб многоугольники выглядели как стекло. Помогите хоть как начать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
20.04.2012, 16:24     OpenGL и материалы #2
воспользуйтесь glColor4f. Четвертым параметром идет прозрачность.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
20.04.2012, 17:54     OpenGL и материалы #3
У стекла хорошая отражательная способность (надо установить белый цвет реакции на Specular и высокое значение экспоненты блеска) и одновременно слабая реакция на диффузное освещение. Разумеется, надо ещё и установить параметры источника света и вообще настроить работу освещения. Чтобы блеск выглядел нормально, надо пользоваться объектами, составленными из достаточно мелких треугольников.
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
20.04.2012, 22:01  [ТС]     OpenGL и материалы #4
Добавил я источник света, почему объекты не сохраняют свои цвета? И как правильно настроить параметры материалов?

Код
#include <GL/glut.h> 

static int kv= 1;
static int kd = 1;

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;

        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;

        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }

    glutPostRedisplay();
}


void display()
{
       

	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 1};
    GLfloat light0_direction[] = {0.0, 0.0, 1.0, 0.005};
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);


	glBegin(GL_POLYGON);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(150 - kv,300);
	glVertex2i(200, 250-kv);
	glVertex2i(300+kv, 300);
	glVertex2i(275, 350+kv);
	glVertex2i(200, 350+kv);
	glEnd();
	

	
	glBegin(GL_POLYGON);
	glColor3f(0.0, 0.0, 1.0);
	glVertex2i(450-kd, 300);
	glColor3f(0.0, 1.0, 0.0);
	glVertex2i(500, 250-kd);
	glColor3f(1.0, 0.0, 1.0);
	glVertex2i(600, 250-kd);
	glColor3f(1.0, 1.0, 0.0);
	glVertex2i(610+kd,260);
	glColor3f(1.5, 0.5, 0);
	glVertex2i(575, 350+kd);
	glColor3f(0.0, 1.0, 1.0);
	glVertex2i(500, 350+kd);

	glEnd();
	
	glDisable(GL_LIGHT0);
	
	glutSwapBuffers();
}



int main (int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowSize(800, 600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("Lab Darbs 2");
	glutKeyboardFunc(key);


     glClearColor (1, 1, 1, 1);

     glEnable(GL_LIGHTING);

     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

     glEnable(GL_NORMALIZE);



	
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	
	glutMainLoop();
	
	return 0;
}
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
21.04.2012, 10:08     OpenGL и материалы #5
Во-первых, источнику света надо настроить не только Diffuse, но и Specular. Не помешает настроить и глобальный Ambient. Во-вторых, надо пользоваться уже не glColor, а glMaterial, для чего попутно включить GL_LIGHTING и выключить GL_COLOR_MATERIAL. Основные компоненты материала настраиваются так же, как и цвет (заметим, в массиве надо указывать 4 компонента, не 3), но каждый имеет свою роль: Ambient - интенсивность "захвата" фонового освещения, Diffuse - обычное рассеянное освещение, Specular - цвет бликов. Кроме того, материалу задаётся экспонента Shininess exponent, которая отвечает за свойства "зеркальности" - чем больше экспонента, тем более узкие блики (что соответствует гладким зеркальным поверхностям).
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
22.04.2012, 18:25  [ТС]     OpenGL и материалы #6
Ну, я что-то попытался настроить. Добавил параметры материала. Но я не совсем понял что значит
в массиве надо указывать 4 компонента, не 3
. Ну, в общем, я нашел параметры материала для стекла и указал их, но на стекло это ни как не похоже. Мне кажется, что с настройкой освещения у меня что-то не правильно, помогите, пожалуйста. Спасибо.
Код
#include <GL/glut.h> 

static int kv= 1;
static int kd = 1;

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;

        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;

        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }

    glutPostRedisplay();
}


void display()
{
       

	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 0, 1.0};
    GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    
    GLfloat spec[] = {0.9, 0.9, 0.9, 1.0};
    GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 1.0};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
	glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
	glMaterialf(GL_FRONT, GL_SHININESS, 96);
	glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    

    glBegin(GL_POLYGON);
	glVertex2i(150 - kv,300);
	glVertex2i(200, 250-kv);
	glVertex2i(300+kv, 300);
	glVertex2i(275, 350+kv);
	glVertex2i(200, 350+kv);
	glEnd();
	
	
	glDisable(GL_LIGHT0);
	
	glutSwapBuffers();
}



int main (int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowSize(800, 600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("Glass");
	glutKeyboardFunc(key);


     glClearColor (1, 1, 1, 1);

     glEnable(GL_LIGHTING);

     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

     glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);
     
     glDisable(GL_COLOR_MATERIAL);
     
     float global_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

	
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	
	glutMainLoop();
	
	return 0;
}
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
23.04.2012, 18:44     OpenGL и материалы #7
Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
Это эквивалентно заданию позиции источника света в координатах (100, 200, 200). Советую внимательнее изучить смысл однородных координат и способы задания параллельных и точечных источников света.

Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat light0_diffuse[] = {1, 1, 0, 1.0};
Это ярко-жёлтый цвет, светить лучше белым.

Цитата Сообщение от veter48 Посмотреть сообщение
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
Надо задать источнику света ещё и бликовую яркость, GL_SPECULAR. И тоже белым цветом. Эта компонента освещения считается отдельно. По умолчанию эта компонента в источниках света загнана в ноль.

Цитата Сообщение от veter48 Посмотреть сообщение
GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
В этом нет необходимости, по умолчанию материалы сами не светятся.

Цитата Сообщение от veter48 Посмотреть сообщение
glBegin(GL_POLYGON);
Эта фигура состоит из нескольких треугольников и будет выглядеть очень так себе. Рекомендую составить фигуру хотя бы из нескольких сотен треугольников (а лучше - больше).

Цитата Сообщение от veter48 Посмотреть сообщение
float global_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
Совсем выключать фоновое освещение не очень хорошо, так неосвещённые участки скатываются в непроглядную черноту. Лучше оставить некоторую небольшую интенсивность.
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
24.04.2012, 22:43  [ТС]     OpenGL и материалы #8
Эта фигура состоит из нескольких треугольников и будет выглядеть очень так себе. Рекомендую составить фигуру хотя бы из нескольких сотен треугольников (а лучше - больше).
Вот я не пойму что вы имеете в виду. Я в этом мало разбираюсь, может всё-таки как-то можно добиться того, чтоб GL_POLYGON выглядел как стекло? Я еще подправил свет, и вроде что-то похоже на серое стекло, но хочется больше прозрачности, бликов. Спасибо.

Код
#include <GL/glut.h> 

static int kv= 1;
static int kd = 1;

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, w, 0, h);
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;

        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;

        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
    }

    glutPostRedisplay();
}


void display()
{
       

	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {1, 1, 1, 1.0};
    //GLfloat light0_direction[] = {0.5, 1, 1, 0.005};
    GLfloat light0_direction[] = {0.5, 0.5, 0.5, 0.005};
    GLfloat light0_spec[] = {1, 1, 1, 1.0};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_spec);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    
    GLfloat spec[] = {1, 1, 1, 1.0};
    GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 1.0};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
	glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
	glMaterialf(GL_FRONT, GL_SHININESS, 5);
	glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    

    glBegin(GL_POLYGON);
	glVertex2i(150 - kv,300);
	glVertex2i(200, 250-kv);
	glVertex2i(300+kv, 300);
	glVertex2i(275, 350+kv);
	glVertex2i(200, 350+kv);
	glEnd();
	
	
	glDisable(GL_LIGHT0);
	
	glutSwapBuffers();
}



int main (int argc, char * argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
	glutInitWindowSize(800, 600);
	glutInitWindowPosition(100,100);
	glutCreateWindow("Glass");
	glutKeyboardFunc(key);


     glClearColor (1, 1, 1, 1);

     glEnable(GL_LIGHTING);

     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

     glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);
     
     glDisable(GL_COLOR_MATERIAL);
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
     float global_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

	
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	
	glutMainLoop();
	
	return 0;
}
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
24.04.2012, 22:51     OpenGL и материалы #9
С прозрачностью - вопрос отдельный, а для натуральных бликов надо или составлять фигуру из большого количества мелких треугольников (GL_TRIANGLES, GL_TRIANGLE_STRIP), либо вообще на шейдеры переходить. Первое намного проще.
Например, у нас есть куб. Самое простое - представить каждую его грань в виде квадрата и разделить по диагонали на два треугольника. Но если мы хотим бликов, то надо разбить каждую грань на сеточку из квадратов (скажем, 20*20) и уже каждый такой маленький квадратик представить как два мелких треугольничка. Это можно выполнить циклами. При этом надо задавать в каждой вершине нормаль (glNormal3f) как перпендикуляр к грани куба, причём единичной длины. На таком кубике блеск будет уже неплохо смотреться.
Ну а чтобы совсем хорошо - рисовать шейдеры, рассчитывать в них попиксельное освещение по Фонгу и всё такое...
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
27.04.2012, 20:42  [ТС]     OpenGL и материалы #10
Может, можете показать какой-то пример? Я как-то не понимаю, как это все реализовать?
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
28.04.2012, 17:23     OpenGL и материалы #11
Ну вот, например, процедурное рисование кубика, каждая грань которого поделена на энное число квадратиков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void DrawCubeSide(const float size, const unsigned int divisions) // нарисовать грань куба на плоскости XY
{
    const float squareSize = size / divisions;  // размер одной ячейки
    const float startPoint = -size/2;
    for(size_t i=0; i<divisions; ++i)
        for(size_t j=0; j<divisions; ++j)
        {
            const float x0 = i*squareSize + startPoint, x1 = x0 + squareSize;
            const float y0 = j*squareSize + startPoint, y1 = y0 + squareSize;
            glBegin(GL_TRIANGLES);
            glNormal3f(0, 0, -1);
            glVertex3f(x0, y0, startPoint);
            glVertex3f(x1, y0, startPoint);
            glVertex3f(x0, y1, startPoint);
            glVertex3f(x0, y1, startPoint);
            glVertex3f(x1, y0, startPoint);
            glVertex3f(x1, y1, startPoint);
            glEnd();
        }
}
 
void DrawCube(const float size, const unsigned int divisions)
{
    // лицевая грань
    DrawCubeSide(size, divisions);
    // задняя грань
    glPushMatrix();
    glRotatef(180, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    // Левая и правая грани
    glPushMatrix();
    glRotatef(90, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    glPushMatrix();
    glRotatef(-90, 0, 1, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
 
    // Верхняя и нижняя грани
    glPushMatrix();
    glRotatef(90, 1, 0, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
    glPushMatrix();
    glRotatef(-90, 1, 0, 0);
    DrawCubeSide(size, divisions);
    glPopMatrix();
}
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
08.05.2012, 22:13  [ТС]     OpenGL и материалы #12
Все равно не понимаю как нарисовать многоугольники таким способом и как сделать это все похожем на стекло Помогите пожалуйста, уже срочно надо.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
09.05.2012, 12:12     OpenGL и материалы #13
Цитата Сообщение от veter48 Посмотреть сообщение
как нарисовать многоугольники таким способом
Ну я уж и не знаю, как ещё доступней объяснить... Разбить многоугольник на большое количество треугольников, что может быть непонятного-то?

Цитата Сообщение от veter48 Посмотреть сообщение
как сделать это все похожем на стекло
А это уже зависит от того, какая именно степень похожести требуется. Характеристики освещения подобрать - это одно дело, это несложно. Прозрачность уже похитрее делается, рефракция требует уже серьёзных усилий, а уж какие-нибудь эффекты высшей категории вроде caustic - сам понимаешь...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 18:23     OpenGL и материалы
Еще ссылки по теме:

C++ Нужны материалы на тему "С++ и работа с сетью"
C++ Подкиньте материалы для изучения С++ с нуля
Материалы по STL C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
veter48
0 / 0 / 0
Регистрация: 09.11.2008
Сообщений: 87
09.05.2012, 18:23  [ТС]     OpenGL и материалы #14
Ну похожесть мне нужна довольно примитивное, вот я немного поигрался, и в принципе добился того чего хотел, добавить бы немного глянца, может немного поможете?


Код
#include <GL/glut.h> 
 
static int kv= 1;
static int kd = 1;
 
void reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, w, 0, h);
    
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
static void key(unsigned char key, int x, int y)
{
    switch (key) 
    {
        case 27 : 
        case 'q':
            exit(0);
            break;
 
        case '+':
            if (kv < 75 & kd < 75) 
            {
             kv += 1;
             kd += 1;
            }
            break;
 
        case '-': 
            if (kv > -5 & kd > -5) 
            {
             kv -= 1; 
             kd -= 1; 
            }
            break;
            
            case '[': 
            if (kv > -5) 
            {
             kv -= 1;  
            }
            break;
            
            case ']': 
            if (kv < 75) 
            {
             kv += 1;  
            }
            break;
            
            case ',': 
            if (kd > -5) 
            {
             kd -= 1;  
            }
            break;
            
            case '.': 
            if (kd < 75) 
            {
             kd += 1;  
            }
            break;
    }
 
    glutPostRedisplay();
}
 
 
void display()
{
       
 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      
    GLfloat light0_diffuse[] = {0.7, 0.7, 0.7, 1.0};
    GLfloat light0_direction[] = {1.8, 1.5, 2.9, 0.005};
 
    GLfloat light0_spec[] = {0.5, 0.5, 0.5, 1.0};
 
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light0_spec);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_direction);
    
    glEnable (GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
    GLfloat spec[] = {0.8, 0.8, 0.8, 1};
    GLfloat ambient[] = {1.0, 0, 0, 1};
    GLfloat dif[] = {0.588235, 0.670588, 0.729412, 0.15};
    GLfloat emis[] = {0.0, 0.0, 0.0, 1.0};
    glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
    glMaterialf(GL_FRONT, GL_SHININESS, 125);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif);
    glMaterialfv(GL_FRONT, GL_EMISSION, emis);
    
 
    glBegin(GL_POLYGON);
    glVertex2i(150 - kv,300 +kv);
    glVertex2i(160 - kv,260);
    glVertex2i(200, 250-kv);
    glVertex2i(300+kv, 300);
    glVertex2i(275, 350+kv);
    glVertex2i(200, 350+kv);
    glEnd();    

    GLfloat ambienttwo[] = {0, 0, 1, 1.0};

    glMaterialfv(GL_FRONT, GL_AMBIENT, ambienttwo);
    
    glBegin(GL_POLYGON);
	glVertex2i(450-kd, 300);
	glVertex2i(500, 250-kd);
	glVertex2i(600, 250-kd);
	glVertex2i(610+kd,260);
	glVertex2i(575, 350+kd);
	glVertex2i(500, 350+kd);

	glEnd();
	
	 glDisable(GL_LIGHT0);
    
    glutSwapBuffers();
}
 
 
 
int main (int argc, char * argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100,100);
    glutCreateWindow("2. LD");
    glutKeyboardFunc(key);
 
 
     glClearColor (1, 1, 1, 1);
 
     glEnable(GL_LIGHTING);
 
     glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
     //glEnable(GL_NORMALIZE);
     
     glEnable(GL_LIGHTING);

     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
     
     float global_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
 
    
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    
    glutMainLoop();
    
    return 0;
}
Yandex
Объявления
09.05.2012, 18:23     OpenGL и материалы
Ответ Создать тему
Опции темы

Текущее время: 16:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru