之前做出来的东西虽然说也有颜色,但是光照效果我是一直都想添加的,而且估计学习opengl这一部分的东西也要在这个之后完结了,开始打算做更贴近于我自己专业的东西了,那就加把劲,把它搞定
这一部分确实是相对来说比较难的,看了好多博文好多都根本就说了半天没用的,整的我整个人都很聒噪,那我还是一步一步来
其实最简单的加光照的方法就是在之前绘制立方体的图的代码之前加上这么一段
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0); //使用第0号光照
glEnable(GL_LIGHTING); //在后面的渲染中使用光照
//glMatrixMode(GL_PROJECTION);//对投影矩阵操作
//glLoadIdentity();//将坐标原点移到中心
//gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);//设置透视投影矩阵
//glMatrixMode(GL_MODELVIEW);//对模型视景矩阵操作
//glLoadIdentity();
//gluLookAt(1.0, 1.5, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//视点转换
GLfloat sun_light_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat sun_light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
GLfloat sun_light_diffuse[] = { 1.0f, 1.0f, 0.0f, 1.0f };
GLfloat sun_light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light_shininess = { 50.0 };
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position); //指定第0号光源的位置 <pre name="code" class="cpp"> //glLightf(GL_LIGHT0, GL_SHININESS, light_shininess);
//glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient); //GL_AMBIENT表示各种光线照射到该材质上,
//经过很多次反射后最终遗留在环境中的光线强度(颜色)
//glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse); //漫反射后~~
//glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);//镜面反射后~~~
看着一大堆,其实注释掉的都没用,之前利用的那些矩阵也没用,简化之,就几行
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0); //使用第0号光照
glEnable(GL_LIGHTING); //在后面的渲染中使用光照
GLfloat sun_light_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position); //指定第0号光源的位置
简单吧,只有短短六行代码就能显示出光照的效果
#include<GL/GLUT.H>
#include <windows.h>
#include <math.h>
#include <gl/GL.h>
static const GLfloat vertex_list[][3] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
};
GLfloat colors[][3] = {
{ 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 0.0, 0.0, 1.0 },
{ 0.0, 0.5, 0.0 },
{ 0.0, 0.5, 0.5 },
};
static const GLint index_list[][4] = {
0, 1, 2, 3,//bottem
0, 3, 7, 4,//left
2, 3, 7, 6,//front
1, 2, 6, 5,//right
0, 1, 5, 4,//back
4, 5, 6, 7//top
};
void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0); //使用第0号光照
glEnable(GL_LIGHTING); //在后面的渲染中使用光照
GLfloat sun_light_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position); //指定第0号光源的位置
glRotatef(45, 1, 1, -1);
for (int i = 0; i < 6; ++i) // 有六个面,循环六次
{
glColor3f(colors[i][0], colors[i][1], colors[i][2]);
glBegin(GL_POLYGON);
for (int j = 0; j < 4; ++j) // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}
glColor3f(1, 0, 0);
for (int i = 0; i < 6; ++i) // 有六个面,循环六次
{
glBegin(GL_LINE_LOOP);
for (int j = 0; j < 4; ++j) // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("opengl1");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
完整代码如上,效果如下
这里我聒噪了好久,为什么灰头土脸的。。后来一查。加了光源的原因,貌似要加材质,先来看一下材质的函数
glMaterial--对于光照模型定义材质函数
void glMaterialf(GLenumface,GLenum pname,GLfloat param);
void glMateriali(GLenum face,GLenum pname,GLint param);
face表示那一面更新,是GL_FRONT, GL_BACK, or GL_FRONT_AND_BACK之中的一个
pname制定要更新的面的单值材质参数,必定是GL_SHININESS
param制定了参数 GL_SHININESS被设定成的値
参数值
|
默认值
|
意义
|
GL_AMBIENT
|
(0.2,0.2,0.2,1.0)
|
材质的环境颜色
|
GL_DIFFUSE
|
(0.8,0.8,0.8,1.0)
|
材质的散射颜色
|
GL_AMBIENT_AND_DIFFUSE
|
材质的环境颜色和散射颜色
| |
GL_SPECULAR
|
(0.0,0.0,0.0,1.0)
|
材质的镜面反射颜色
|
GL_SHININESS
|
0.0
|
镜面反射指数
|
GL_EMISSION
|
(0.0,0.0,0.1,1.0)
|
材质的发射光颜色
|
GL_COLOR_INDEXES
|
(0, 1, 1)
|
环境颜色索引、散射颜色索引和镜面反射颜色索引
|
终于研制成功啦!!有颜色啦【虽然看起来比较傻
二话不说,先上代码
<pre name="code" class="cpp">#include<GL/GLUT.H>
#include <windows.h>
#include <math.h>
#include <gl/GL.h>
static const GLfloat vertex_list[][3] = {
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
};
GLfloat colors[][3] = {
{ 1.0, 0.0, 0.0 },
{ 1.0, 1.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 1.0, 1.0 },
{ 1.0, 0.0, 1.0 },
{ 0.0, 0.0, 1.0 }
};
static const GLint index_list[][4] = {
0, 1, 2, 3,//bottem
0, 3, 7, 4,//left
2, 3, 7, 6,//front
1, 2, 6, 5,//right
0, 1, 5, 4,//back
4, 5, 6, 7//top
};
void myDisplay(void){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0); //使用第0号光照
glEnable(GL_LIGHTING); //在后面的渲染中使用光照
GLfloat sun_light_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
//定义 的漫反射特性
GLfloat mat_diffuse[]={
1.0, 0.0, 0.0,1.0,
1.0, 1.0, 0.0,1.0,
0.0, 1.0, 0.0,1.0,
0.0, 1.0, 1.0,1.0,
1.0, 0.0, 1.0,1.0,
0.0, 0.0, 1.0,1.0,
};
glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position); //指定第0号光源的位置
glRotatef(45, 1, 1, 1);
for (int i = 0; i < 6; ++i) // 有六个面,循环六次
{
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse+4*i);
glBegin(GL_POLYGON);
for (int j = 0; j < 4; ++j) // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("opengl1");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
看起来复杂,其实重要的就是只有这么一段
GLfloat mat_diffuse[]={
1.0, 0.0, 0.0,1.0,
1.0, 1.0, 0.0,1.0,
0.0, 1.0, 0.0,1.0,
0.0, 1.0, 1.0,1.0,
1.0, 0.0, 1.0,1.0,
0.0, 0.0, 1.0,1.0,
};
还有就是后面的
for (int i = 0; i < 6; ++i) // 有六个面,循环六次
{
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse+4*i);
glBegin(GL_POLYGON);
for (int j = 0; j < 4; ++j) // 每个面有四个顶点,循环四次
glVertex3fv(vertex_list[index_list[i][j]]);
glEnd();
}
也就是我这里只使用了一种效果,材质的散射颜色
效果是酱的,和之前的对比是酱的
如果去掉了光照,图像就没有了颜色效果。。成了一片白。。可见光照和材质是相互依存的关系
如果再加上其他一些材质参数,加到绘制图形的前面
//首先定义一个材质,定义方法非常类似前面讲到的光源定义。
GLfloat mat_ambient[]={0.8,0.8,0.8,1.0};
//定义 亮紫色 的镜面反射特性
GLfloat mat_specular[]={1.0,0.0,1.0,1.0};
//定义镜面反射的光亮度
GLfloat mat_shininess[]={50.0};
//将以上材质定义应用
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
//glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
暂时就是这样啦^^
到目前,我已经把基础的东西差不多懂了,之后主要还有一块关于纹理的可能我之后会抽空补过去,希望大家也能像我一样有些收获吧,我之后会再根据自己的方向做一些其他方向的事情,谢谢您的关注,我会努力的^^