7.OpenGL--光照

来源:互联网 发布:python 搭建技术博客 编辑:程序博客网 时间:2024/06/05 08:59
  • 理论基础 
    1,人眼所看到的五颜六色的世界是由于物体表面反射到眼睛的颜色形成的,而这个反射颜色是由物体本身和光源共同决定的。某种颜色的物体反射对应颜色的光,吸收其它颜色的光,如红色物体吸收全部的G,B颜色,反射全部的R颜色。opengl把光单独分成4种类型:环境光(均匀充满场景),散射光(手电筒),镜面光(朝特定一方向反射),发射光(夜明珠)。他们单独计算,最后叠加在一起,构成整个光照系统。 
    2,法线向量:是一条垂直于某个表面的方向向量。除了顶点外,不能为多边形其他地方分配法线。同一个多边形的顶点可能共享同一条法线(平表面),也可能具有不同的法线(曲面)。物体的法线向量其实就是定义了它的表面在空间中的方向。具体地说,定义了它相对光源的方向,opengl就是使用法线向量确定这个物体的各个顶点所接收的光照。(glNormal) 
    3,光照操作一般就是指定3个东西:一,光照模型 二,光源属性 三,材料属性。如果没有指定,开启光源也会给予这3个东西默认值。

  • 实例代码 
    1,绘制光照球体
#include "GLTools.h"#include "GLShaderManager.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endifvoid init(void){    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat mat_shininess[] = { 50.0 };    GLfloat light_ambient[] = {0.0, 0.0, 1.0, 1.0};    GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0};    GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};    /*方向性光源(最后参数为0):光源位于无限远处,当光线到达物体表面时,可以认为所有光线都是平行的。如太阳光     位置性光源(最后参数非零):不同角度位置光照强度不同,表现更加逼真。如聚光灯*/    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };    glClearColor (0.0, 0.0, 0.0, 0.0);    glShadeModel (GL_SMOOTH);    /*设置材料与光源属性*/    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);    //光源位置    glLightfv(GL_LIGHT0, GL_POSITION, light_position);    //环境光    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);    //散射光    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);    //镜面强度    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);    //激活光照并启动0号光源(启动了就会有默认属性)    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    glEnable(GL_DEPTH_TEST);}void display(void){    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glutSolidSphere (1.0, 20, 16);//绘制球体(它同时也定义了它的法线向量)    glFlush ();}void reshape (int w, int h){    glViewport (0, 0, (GLsizei) w, (GLsizei) h);    glMatrixMode (GL_PROJECTION);    glLoadIdentity();    if (w <= h)        glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,                 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);    else        glOrtho (-1.5*(GLfloat)w/(GLfloat)h,                 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}void keyboard(unsigned char key, int x, int y){    switch (key) {        case 27:            exit(0);            break;    }}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);    glutInitWindowSize (500, 500);    glutInitWindowPosition (100, 100);    glutCreateWindow (argv[0]);    init ();    glutDisplayFunc(display);    glutReshapeFunc(reshape);    glutKeyboardFunc(keyboard);    glutMainLoop();    return 0;}
  • 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
  • 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

这里写图片描述

2,光源的移动

#include "GLTools.h"#include "GLShaderManager.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endifstatic int spin = 0;void init(void){    glClearColor (0.0, 0.0, 0.0, 0.0);    glShadeModel (GL_SMOOTH);    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    glEnable(GL_DEPTH_TEST);}void display(void){    GLfloat position[] = { 0.0, 0.0, 1.5, 1.0 };    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glPushMatrix ();        gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);        glPushMatrix ();            /*光源旋转*/            glRotated ((GLdouble) spin, 1.0, 0.0, 0.0);            glLightfv (GL_LIGHT0, GL_POSITION, position);            /*绘制一个不受光照的正方体表示光源*/            glTranslated (0.0, 0.0, 1.5);            glDisable (GL_LIGHTING);            glColor3f (0.0, 1.0, 1.0);            glutWireCube (0.1);            glEnable (GL_LIGHTING);        glPopMatrix ();        glutSolidTorus (0.275, 0.85, 8, 15);    glPopMatrix ();    glFlush ();}void reshape (int w, int h){    glViewport (0, 0, (GLsizei) w, (GLsizei) h);    glMatrixMode (GL_PROJECTION);    glLoadIdentity();    gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}void mouse(int button, int state, int x, int y){    switch (button)    {        case GLUT_LEFT_BUTTON:            if (state == GLUT_DOWN)            {                spin = (spin + 30) % 360;                glutPostRedisplay();            }            break;        default:            break;    }}void keyboard(unsigned char key, int x, int y){    switch (key)    {        case 27:            exit(0);            break;    }}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);    glutInitWindowSize (500, 500);    glutInitWindowPosition (100, 100);    glutCreateWindow (argv[0]);    init ();    glutDisplayFunc(display);    glutReshapeFunc(reshape);    glutMouseFunc(mouse);    glutKeyboardFunc(keyboard);    glutMainLoop();    return 0;}
  • 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
  • 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

这里写图片描述

3,材料属性变化对表现的影响

#include "GLTools.h"#include "GLShaderManager.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endifvoid init(void){    GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };    GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };    GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };    glClearColor(0.0, 0.1, 0.1, 0.0);    glEnable(GL_DEPTH_TEST);    glShadeModel(GL_SMOOTH);    //光源属性    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);    glLightfv(GL_LIGHT0, GL_POSITION, position);    //光照模型    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);//环境光强度    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);//局部观察点还是无限远观察点    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);}void display(void){    GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };    GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };    GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };    GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat no_shininess[] = { 0.0 };    GLfloat low_shininess[] = { 5.0 };    GLfloat high_shininess[] = { 100.0 };    GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    /*材料属性*/    glPushMatrix();    glTranslatef (-3.75, 3.0, 0.0);    //材料的环境颜色    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    //材料的散射颜色    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    //材料的镜面颜色    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    //镜面指数    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    //材料的发射颜色    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(1,2)*/    glPushMatrix();    glTranslatef (-1.25, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(1,3)*/    glPushMatrix();    glTranslatef (1.25, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(1,4)*/    glPushMatrix();    glTranslatef (3.75, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(2,1)*/    glPushMatrix();    glTranslatef (-3.75, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(2,2)*/    glPushMatrix();    glTranslatef (-1.25, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(2,3)*/    glPushMatrix();    glTranslatef (1.25, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(2,4)*/    glPushMatrix();    glTranslatef (3.75, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(3,1)*/    glPushMatrix();    glTranslatef (-3.75, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(3,2)*/    glPushMatrix();    glTranslatef (-1.25, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(3,3)*/    glPushMatrix();    glTranslatef (1.25, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    /*(3,4)*/    glPushMatrix();    glTranslatef (3.75, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    glFlush();}void reshape(int w, int h){    glViewport(0, 0, w, h);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    if (w <= (h * 2))        glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,                 3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);    else        glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),                 6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}void keyboard(unsigned char key, int x, int y){    switch (key) {        case 27:            exit(0);            break;    }}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);    glutInitWindowSize (600, 450);    glutCreateWindow(argv[0]);    init();    glutReshapeFunc(reshape);    glutDisplayFunc(display);    glutKeyboardFunc (keyboard);    glutMainLoop();    return 0;}
  • 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
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 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
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224

这里写图片描述

4,颜色材料模式:频繁更改材料属性效率更高的方式

#include "GLTools.h"#include "GLShaderManager.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endif//需要频繁改变的材料属性GLfloat diffuseMaterial[4] = { 0.5, 0.5, 0.5, 1.0 };void init(void){    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };    glClearColor (0.0, 0.0, 0.0, 0.0);    glShadeModel (GL_SMOOTH);    glEnable(GL_DEPTH_TEST);    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialf(GL_FRONT, GL_SHININESS, 25.0);    glLightfv(GL_LIGHT0, GL_POSITION, light_position);    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    /*频繁更改材料属性,这个效率更高,它只需要更改相应颜色值     就可以更改材料属性,减少glMaterial*()调用次数*/    glColorMaterial(GL_FRONT, GL_DIFFUSE);     //激活颜色材料模式    glEnable(GL_COLOR_MATERIAL);}void display(void){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glutSolidSphere(1.0, 20, 16);    glFlush ();}void reshape (int w, int h){    glViewport (0, 0, (GLsizei) w, (GLsizei) h);    glMatrixMode (GL_PROJECTION);    glLoadIdentity();    if (w <= h)        glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,                 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);    else        glOrtho (-1.5*(GLfloat)w/(GLfloat)h,                 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();}void mouse(int button, int state, int x, int y){    //更改材料散射颜色    switch (button) {        case GLUT_LEFT_BUTTON:            if (state == GLUT_DOWN) {                diffuseMaterial[0] += 0.1;                if (diffuseMaterial[0] > 1.0)                    diffuseMaterial[0] = 0.0;                glColor4fv(diffuseMaterial);                glutPostRedisplay();            }            break;        case GLUT_MIDDLE_BUTTON:            if (state == GLUT_DOWN) {                diffuseMaterial[1] += 0.1;                if (diffuseMaterial[1] > 1.0)                    diffuseMaterial[1] = 0.0;                glColor4fv(diffuseMaterial);                glutPostRedisplay();            }            break;        case GLUT_RIGHT_BUTTON:            if (state == GLUT_DOWN) {                diffuseMaterial[2] += 0.1;                if (diffuseMaterial[2] > 1.0)                    diffuseMaterial[2] = 0.0;                glColor4fv(diffuseMaterial);                glutPostRedisplay();            }            break;        default:            break;    }}void keyboard(unsigned char key, int x, int y){    switch (key) {        case 27:            exit(0);            break;    }}int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);    glutInitWindowSize (500, 500);    glutInitWindowPosition (100, 100);    glutCreateWindow (argv[0]);    init ();    glutDisplayFunc(display);     glutReshapeFunc(reshape);    glutMouseFunc(mouse);    glutKeyboardFunc(keyboard);    glutMainLoop();    return 0;}
  • 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
  • 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

这里写图片描述

0 0
原创粉丝点击