您的位置:首页 > 运维架构

OpenGL(四)光照材质

2016-07-09 21:55 351 查看










通过下面的光照的三菱锥例子学习知识点

<span style="font-size:18px;">#include<windows.h>
#include<gl/gl.h>
#include<gl/glut.h>
#include<gl/glu.h>
#include<stdio.h>

//学习点 设置环境光 材质光
//一共有四种光照模型,环境光,漫射光,镜面光,辐射光
//材质最终的光源取决于    光照跟材质的光

//旋转角度参数
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;

//颜色跟中模式
BOOL bColorMaterial = FALSE;

//初始化窗口
void SetupRC(void)
{
//设置窗口背景西颜色为黑色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
//指定多变形的阴影模式为平面阴暗模式
glShadeModel(GL_FLAT);

}
void ChangeSize(int w, int h)
{
if (h == 0)
h = 1;

glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if (w <= h)
{
glOrtho(-100.0f, 100.0f, -100.0f*h / w, 100.0f*h / w, -100.0f, 100.0f);
}
else
{
glOrtho(-100.0f*w / h, 100.0f*w / h, -100.0f, 100.0f, -100.0f, 100.0f);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void RenderScene(void)
{
//清除颜色及深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);

/*设置光照模型*/
//设置光照
glEnable(GL_LIGHTING);
//环境光RGBA的值
GLfloat ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f };
// 设置ambient{ 0.2f, 0.2f, 0.2f, 1.0f };调式可以改变环境光看看效果(变暗淡).加深理解
//设置全局环境光
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient);

/*设置材质属性*/
//设置材质属性
if (bColorMaterial)
{
//启动颜色跟踪法
glEnable(GL_COLOR_MATERIAL);
//指定多边形的正面使用颜色跟踪法
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
}
else
{
//关闭颜色跟踪法
glDisable(GL_COLOR_MATERIAL);
GLfloat material_ambient[] = { 0.75f, 0.75f, 0.75f, 1.0f };
//指定多变形的正面的环境反射和漫反射值
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, material_ambient);
}

//旋转图形
glPushMatrix();
//角度正负决定是顺逆时针
glRotatef(xRot, 1.0f, 0.0f, 0.0f); //使整个场景绕着x轴旋转
glRotatef(yRot, 0.0, 1.0, 0.0f);   //使整个场景绕着y轴旋转

//指定顺时针绕法的多变形为正多变边形正面
glFrontFace(GL_CW);

//绘制三菱锥的三个棱面
//他们的颜色分别为红、绿、蓝
glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0, 0.0, 80);
glVertex3f(0.0, 50.0, 0.0);

glColor3f(1.0, 0.0, 0.0);  //红色
glVertex3f(50.0, -50.0, 0.0);

glColor3f(0.0f, 1.0f, 0.0); //绿色
glVertex3f(-50.0, -50.0, 0.0);

glColor3f(0.0f, 0.0f, 1.0f); //蓝色
glVertex3f(0.0, 50.0, 0.0);

glEnd();

//绘制三菱锥的地面,其颜色为黄色
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0, 50.0, 0.0);
glVertex3f(50.0, -50.0, 0.0);
glColor3f(1.0, 1.0, 0.0);  //黄色
glVertex3f(-50.0, -50.0, 0.0);
glEnd();

glPopMatrix();
glutSwapBuffers();  //刷新命令缓冲区
}

void SpecialKeys(int key, int x, int y)
{
if (key == GLUT_KEY_UP)    xRot -= 5.0f;
if (key == GLUT_KEY_DOWN)  xRot += 5.0f;
if (key == GLUT_KEY_LEFT)  yRot -= 5.0f;
if (key == GLUT_KEY_RIGHT) yRot += 5.0f;

//结合glPushMatrix()和glPopMatrix()绘图模式理解旋转
// 首先,glPushMateix记住来的绘图坐标(起点)
//glRotatef(xRot, 1.0f, 0.0f, 0.0f);
//glRotatef(yRot, 0.0f, 1.0f, 0.0f);
//然后旋转相应的坐标后绘制图形
//glPopMatrix 回到了坐标原来的位置(起点)

printf("%lf\n", yRot);
if (xRot >= 360.0f)   xRot = 0.0f;
if (xRot < -1.0f)    xRot = 355.0f;
if (yRot >= 360.0f)    yRot = 0.0f;
if (yRot < -1.0f)    yRot = 355.0f;

//刷新窗口  强制
glutPostRedisplay();
}
void ProcessMenu(int value)
{
switch (value)
{
case 1:bColorMaterial = FALSE;
break;
case 2:bColorMaterial = TRUE;
break;
default:
break;
}
//强制刷新
glutPostRedisplay();
}

int main(int argc, char *argv[])
{

//initialize the GLUT library
//初始化GLUT库
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("加光照的三棱锥");

//回调函数
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);

glutSpecialFunc(SpecialKeys);
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("普通材质", 1);
glutAddMenuEntry("颜色跟踪材质", 2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
return 0;
}

</span>
未启动颜色跟踪效果图                                                                 启动颜色跟踪效果图


                                    




               //启动颜色跟踪法
glEnable(GL_COLOR_MATERIAL);
//指定多边形的正面使用颜色跟踪法
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: