OpenGL编程指南12:光照_渲染真实球体
1.场景中添加光照的步骤
1.定义每个物体的每个顶点的法线向量。这个法向量决定了物体相对于光源的方向。2.创建和选择一个或多个光照,并设置他们的位置。3.创建和选择一种光照模型,它定义了全局环境光的层析以及观察点的有效位置(便于进行光照计算)。4.定义场景中物体的材料属性。
2.光照球体及分析
#include <vgl.h>void init(void) {//光照参数初始化全位于此处GLfloat mat_specular [] = {1.0,1.0,1.0,1.0};GLfloat mat_shininess [] = {100.0};GLfloat light_position [] = {5.0,5.0,5.0,1.0}; //点光源//GLfloat light_position [] = {0.0,0.0,50.0,0.0}; //无限远模拟平行光GLfloat white_light [] = {1.0,1.0,1.0,1.0};GLfloat model_ambient [] = {0.1,0.1,0.1,1.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_DIFFUSE,white_light); //定义散射光为白色glLightfv(GL_LIGHT0,GL_SPECULAR,white_light); //定义镜面光为白色glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient); //光照模型参数:全局环境光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,300,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);elseglOrtho(-1.5,1.5,-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); } int main(int argc, char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();return 0; }
输出结果:
3.注意事项
1.定义球体的法向量是在函数gluSolideSphere()中完成的。为了进行正确的光照运算,表面法相必须为单位法向量。2.光照模型中不仅仅定义了全局环境光,还定义了场景中观察者应该位于无限远处还是位于场景本地;也会确定场景中物体的正面和背面是否应该执行不同的光照运算。上例中采用了默认设置,即观察者位于无限远处,并且只有一面接受光照。
OpenGL编程指南12:光照_渲染真实球体相关推荐
- OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结
弄了好几天才把第一个程序运行出来,用该博客记录一下参考的博客资料及问题: 写得很好的博客参考资料为: http://blog.csdn.net/IceTeaSet/article/details/50 ...
- 《OpenGL编程指南(原书第8版)》——计算着色器
原文 http://www.csdn.net/article/2014-11-21/2822754 主题 OpenGL 数学 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊 ...
- OpenGL深入探索——《OpenGL编程指南(原书第8版)》——计算着色器
转载自 <OpenGL编程指南(原书第8版)>--计算着色器 概述 由于图形处理器每秒能够进行数以亿计次的计算,它已成为一种性能十分惊人的器件.过去,这种处理器主要被设计用于承担实时图形渲 ...
- OpenGL编程指南7:视图-
1.前言 计算机图形学的要点就是创建三维物体的二维图像(图像必须是二维的,因为他是在平面的屏幕上显示的).但是,当我们决定怎样在屏幕上绘图时,必须使用三维坐标的方式考虑. 为了把一个物体的三维坐标变成 ...
- OpenGL编程指南4:双缓冲实现运行
1.前言 绘制一个旋转的方块,主要为了说明glutSwapBuffers()函数的用法. 同时也为了学习如何使用GLUT控制输入设备,并打开或关闭空闲处理函数. 2.OpenGL编程及程序剖析 /** ...
- OpenGL编程指南3:GLUT:OpenGL使用工具库
1.前言 我们知道的,OpenGL包含了很多的渲染函数,这些函数的设计目的就是独立与任何窗口系统或操作系统.因此,他并没有包含打开窗口或者从键盘或鼠标读取事件的函数.遗憾的是,如果连最基本的打开窗口的 ...
- 《OpenGL编程指南》一第3章 OpenGL绘制方式
本节书摘来自华章出版社<OpenGL编程指南>一书中的第3章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 Op ...
- OpenGl编程指南例2.4大白话分析
OpenGl编程指南例2.4分析 即上一篇文章搭建了opengl的环境后,继续学习Opengl,被第二章的各种gen,bind,buffer搞得晕头转向,在还没有消化完全的时候,又被一计重击打到--为 ...
- 《OpenGL编程指南》一第2章 着色器基础
本节书摘来自华章出版社<OpenGL编程指南>一书中的第2章,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第2章 着色 ...
最新文章
- PLL_BASE——Basic Phase Locked Loop Clock Circuit(Virtex-5, Spartan-6)
- eclipse远程连接Hadoop,用户认证失败
- java native堆_Java Native Memory比堆更快吗?
- android 获取app自启动权限状态_央视批手机App权限问题:频繁自启动 搜集个人隐私触目惊心...
- thymeleaf教程
- 每个人都应该了解的HTTPS知识
- root权限执行java_执行具有root权限的java代码(一)
- C/C++程序员面试宝典-2
- 照片被误删?别着急,EasyRecovery帮你找回来
- SSH连接工具-Tabby
- 优秀的云计算工程师需要学什么?云计算Docker学习路线
- 高效能人士的七个习惯——由内而外全面造就自己
- 模拟将本地文件上传至外服务器
- Proteus仿真——常用元件
- vue element table expand 扩展行点击行展示且保证只展示一行
- 品达通用权限系统(Day 1~Day 2)
- 如何在jsp里面写java代码
- 联通云服务器优势,多线云服务器有哪些优势?
- Coursera | Grammer and Punctuation(UCI) | Quiz
- 选择OA协同办公系统,这4点一定要注意!