0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
1

OpenGL и материалы

20.04.2012, 16:18. Показов 4571. Ответов 13
Метки нет (Все метки)

Здравствуйте. Есть программа:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#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;
}
И надо сделать так чтоб многоугольники выглядели как стекло. Помогите хоть как начать.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2012, 16:18
Ответы с готовыми решениями:

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя...

Какая значительная разница между OpenGL ES 2.0 и OpenGL 3.3 при использовании в Qt
Привет всем! У меня видеокарта имеет поддержку 3.1 версию OpenGL, обновить хочу её с помощью...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо...

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL?
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без опен джел имеется...

13
45 / 45 / 9
Регистрация: 11.04.2010
Сообщений: 223
20.04.2012, 16:24 2
воспользуйтесь glColor4f. Четвертым параметром идет прозрачность.
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.04.2012, 17:54 3
У стекла хорошая отражательная способность (надо установить белый цвет реакции на Specular и высокое значение экспоненты блеска) и одновременно слабая реакция на диффузное освещение. Разумеется, надо ещё и установить параметры источника света и вообще настроить работу освещения. Чтобы блеск выглядел нормально, надо пользоваться объектами, составленными из достаточно мелких треугольников.
1
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
20.04.2012, 22:01  [ТС] 4
Добавил я источник света, почему объекты не сохраняют свои цвета? И как правильно настроить параметры материалов?

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#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;
}
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
21.04.2012, 10:08 5
Во-первых, источнику света надо настроить не только Diffuse, но и Specular. Не помешает настроить и глобальный Ambient. Во-вторых, надо пользоваться уже не glColor, а glMaterial, для чего попутно включить GL_LIGHTING и выключить GL_COLOR_MATERIAL. Основные компоненты материала настраиваются так же, как и цвет (заметим, в массиве надо указывать 4 компонента, не 3), но каждый имеет свою роль: Ambient - интенсивность "захвата" фонового освещения, Diffuse - обычное рассеянное освещение, Specular - цвет бликов. Кроме того, материалу задаётся экспонента Shininess exponent, которая отвечает за свойства "зеркальности" - чем больше экспонента, тем более узкие блики (что соответствует гладким зеркальным поверхностям).
0
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
22.04.2012, 18:25  [ТС] 6
Ну, я что-то попытался настроить. Добавил параметры материала. Но я не совсем понял что значит
в массиве надо указывать 4 компонента, не 3
. Ну, в общем, я нашел параметры материала для стекла и указал их, но на стекло это ни как не похоже. Мне кажется, что с настройкой освещения у меня что-то не правильно, помогите, пожалуйста. Спасибо.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#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;
}
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
23.04.2012, 18:44 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 };
Совсем выключать фоновое освещение не очень хорошо, так неосвещённые участки скатываются в непроглядную черноту. Лучше оставить некоторую небольшую интенсивность.
0
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
24.04.2012, 22:43  [ТС] 8
Эта фигура состоит из нескольких треугольников и будет выглядеть очень так себе. Рекомендую составить фигуру хотя бы из нескольких сотен треугольников (а лучше - больше).
Вот я не пойму что вы имеете в виду. Я в этом мало разбираюсь, может всё-таки как-то можно добиться того, чтоб GL_POLYGON выглядел как стекло? Я еще подправил свет, и вроде что-то похоже на серое стекло, но хочется больше прозрачности, бликов. Спасибо.

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#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;
}
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
24.04.2012, 22:51 9
С прозрачностью - вопрос отдельный, а для натуральных бликов надо или составлять фигуру из большого количества мелких треугольников (GL_TRIANGLES, GL_TRIANGLE_STRIP), либо вообще на шейдеры переходить. Первое намного проще.
Например, у нас есть куб. Самое простое - представить каждую его грань в виде квадрата и разделить по диагонали на два треугольника. Но если мы хотим бликов, то надо разбить каждую грань на сеточку из квадратов (скажем, 20*20) и уже каждый такой маленький квадратик представить как два мелких треугольничка. Это можно выполнить циклами. При этом надо задавать в каждой вершине нормаль (glNormal3f) как перпендикуляр к грани куба, причём единичной длины. На таком кубике блеск будет уже неплохо смотреться.
Ну а чтобы совсем хорошо - рисовать шейдеры, рассчитывать в них попиксельное освещение по Фонгу и всё такое...
0
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
27.04.2012, 20:42  [ТС] 10
Может, можете показать какой-то пример? Я как-то не понимаю, как это все реализовать?
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
28.04.2012, 17:23 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();
}
0
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
08.05.2012, 22:13  [ТС] 12
Все равно не понимаю как нарисовать многоугольники таким способом и как сделать это все похожем на стекло Помогите пожалуйста, уже срочно надо.
0
Эксперт С++
1671 / 1043 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
09.05.2012, 12:12 13
Цитата Сообщение от veter48 Посмотреть сообщение
как нарисовать многоугольники таким способом
Ну я уж и не знаю, как ещё доступней объяснить... Разбить многоугольник на большое количество треугольников, что может быть непонятного-то?

Цитата Сообщение от veter48 Посмотреть сообщение
как сделать это все похожем на стекло
А это уже зависит от того, какая именно степень похожести требуется. Характеристики освещения подобрать - это одно дело, это несложно. Прозрачность уже похитрее делается, рефракция требует уже серьёзных усилий, а уж какие-нибудь эффекты высшей категории вроде caustic - сам понимаешь...
0
0 / 0 / 1
Регистрация: 09.11.2008
Сообщений: 87
09.05.2012, 18:23  [ТС] 14
Ну похожесть мне нужна довольно примитивное, вот я немного поигрался, и в принципе добился того чего хотел, добавить бы немного глянца, может немного поможете?
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2012, 18:23
Помогаю со студенческими работами здесь

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение.
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на видео карту.В...

(2 главы перевода книги доступно) OpenGL Programming Guide, Version 4.3, 8th Edition - OpenGL
Продолжая тему с переводом книги https://www.cyberforum.ru/opengl/thread1551398.html Выкладываю...

Ошибки при подключение opengl, немного не связанные с opengl
#include &lt;windows.h&gt; #include &quot;stdafx.h&quot; #include &lt;gl/gl.h&gt; #include &lt;gl/glu.h&gt; #include...

Не загружается текстура в OpenGL (OpenGL + Классы)
Здравствуйте! Пишу движок для игры. Первый прототип я сделал процедурно. Все работает как надо. ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru