计算机图形学---Opengl----三维光照

光照

步骤总结

  1. 改成深度缓存
  2. 设置物体表面属性
  3. 建立、设置光源
  4. 打开光源
    一、深度缓存
    void Init()
    {
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    }
    glutInitDisplayMode(AUX_SINGLE|AUX_RGBA|AUX_DEPTH);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
#include <iostream>
#include "Windows.h"
#include "math.h"
#include <iostream>
#include <gl/glut.h>  
using namespace std;
void Init()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    //打开深度缓存并激活
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    //打开阴影
    glShadeModel(GL_SMOOTH);
}
//定义材质的初始化函数
void InitMaterial()
{
    float mat_ambient[] = { 0.0, 1.0, 1.0, 1.0 };//可以决定    RGBA
    float mat_diffuse[] = { 0.0, 1.0, 1.0, 1.0 };//实体的颜色   RGBA
    float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };//镜面反射高光的RGBA颜色
    float mat_shininess[] = { 50.0 };             //控制高点光的大小和亮度,0-128之间的浮点数

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);   //GL_AMBIENT 默认值:(0.2,0.2,0.2,1.0) 对环境光的反射率
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); //GL_DIFFUSE (0.8,0.8,0.8,1.0) 对漫反射的反射率
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); //GL_SPECULAR (0.0,.0.0,0.0,1.0) 对镜面反射光的反射率
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); //GL_SHININESS 0.0 镜面反射指数
 /*glMaterialfv(face, pname, param);
face: 可取 GL_FRONT、GL_BACK、
GL_FRONT_AND_BACK,它表明当前材质应该应用
到物体的哪一个面上;
pname: 说明一个特定的材质;(见书P262)
param: 是材质的具体数值.*/
}
//定义光源的初始化函数
void InitLight()
{
    //单光源
    //float light_position[] = { 1.0, 1.0, 1.0, 0.0 };
   // glLightfv(GL_LIGHT0, GL_POSITION, light_position);
   // glEnable(GL_LIGHTING);
    //glEnable(GL_LIGHT0);
    //双光源,光源0用的默认值
    float light_position0[] = { 1.0, 0.0, 0.0, 0.0 };  //w=0:光源离场景无穷远;w=1:光源离场景较近
    GLfloat light_diffuse0[] = { 1.0, 0.0, 0.0, 1.0 };//光源的颜色由GL_DIFFUSE 、GL_SPECULAR、GL_AMBIENT决定
    GLfloat light_specular0[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position1[] = { -1.0, 1.0, 1.0, 0.0 };
    GLfloat light_diffuse1[] = { 1.0, 0.0, 0.0, 1.0 };//光源的颜色由GL_DIFFUSE 、GL_SPECULAR、GL_AMBIENT决定
    GLfloat light_specular1[] = { 1.0, 1.0, 1.0, 1.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, light_position0);   //GL_POSITION 默认值(0.0,0.0,0.0,0.0) 光源坐标(x,y,z,w)
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse0);     //GL_DIFFUSE (1.0,1.0,1.0,1.0) 漫反射光的RGBA强度值(对物体的影响最大)
    glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular0);
    glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);     //GL_DIFFUSE (1.0,1.0,1.0,1.0) 漫反射光的RGBA强度值(对物体的影响最大)
    glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);  //GL_SPECULAR (1.0,1.0,1.0,1.0) 镜面反射光RGBA强度值
   /*glLightfv(light, pname, param); 
        light: 指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7。        
        pname: 指定光源特性 ;(见书P259)
        param: 设置相应的光源特性值 .*/
//打开光源    
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHT1);
}
void Reshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //3D
    glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       //清屏加了|GL_DEPTH_BUFFER_BIT
        
    gluLookAt(1, 1, 1, 0, 0, 0, 0, 1, 0);
    glPushMatrix();
    glTranslatef(-200,200,0); 
    glutSolidTeapot(50);
    glPopMatrix();
    glutSolidTorus(15,50, 10, 40);
   // glutSolidSphere(100.0, 16, 16);
    glFlush();
}



int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);//加了深度缓存| GLUT_DEPTH

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(840, 680);
    glutCreateWindow("FirstDemo");

    Init();
    InitMaterial();
    InitLight();
    glutDisplayFunc(myDisplay);
    glutReshapeFunc(Reshape);

    glutMainLoop();
    return 0;

}

结果如下:

在这里插入图片描述

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值