RenderMonkey 练习 第二天 【opengl 光照模型】
光照模型
3D渲染中, 物体表面的光照计算公式为:
I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);
其中,环境光(ambient)计算公式为:
Iambient = Aintensity * Acolor ; (Aintensity表示环境光强度,Acolor表示环境光颜色)
漫反射光(diffuse)计算公式为:
Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)
镜面光照(specular)计算公式为:
Ispecular = Sintensity*Scolor*(R.V)n ; (Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量)
综上所得:整个光照公式为:
I = Aintensity * Acolor +Dintensity*Dcolor*N.L + Sintensity*Scolor*(R.V)n ;
将一些值合并,并使用白色作为光照颜色,则上述公式可简化为:
I = A + D*N.L + (R.V)n
漫反射光照:
1. 打开RenderMonkey, 右击WorkSpace的Effect WorkSpace结点,选择Add Default Effect->OpenGL->OpenGL;
2. 添加光源向量: 右击Effect节点选择Add Variable->float->float4; 修改名称为vecLightPosition, 双击设置其值

4. 编写Vertex Shader:
uniform vec4 vecLightPosition;
varying vec3 lightdir;
varying vec3 normal;
void main(void)
{
gl_Position = ftransform();
normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);
}
5. 编写Pixel Shader:
varying vec3 lightdir;
varying vec3 normal;
void main(void)
{
vec4 diffuse = vec4(0.8,0.8,0.8,1.0);
vec4 ambient = vec4(0.3,0.2,0.1,1.0);
vec3 lightDirection = normalize(lightdir);
float fNDotL = dot(normal,lightDirection);
gl_FragColor = ambient + fNDotL * diffuse ;
}
6. 预览效果

镜面反射光照:
1. 添加光源位置 vecLightPosition

2. 添加相机位置 vecEye

3. 顶点shader
uniform vec4 vecLightPosition;
uniform vec4 vecEye;
varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;
void main(void)
{
gl_Position = ftransform();
normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);
viewdir = normalize(vecEye.xyz - fvObjectPosition.xyz);
}
4. 片元shader
varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;
void main(void)
{
vec4 diffuse = vec4(0.8,0.8,0.8,1.0);
vec4 ambient = vec4(0.3,0.2,0.1,1.0);
vec4 specular = vec4(0.0,0.0,0.0,1.0);
vec3 lightDirection = normalize(lightdir);
vec3 viewDirection = normalize(viewdir);
float fNDotL = dot(normal,lightDirection);
vec3 Reflection = normalize(2 * fNDotL * normal - lightDirection);
float fRDotV = dot(Reflection,viewDirection);
/* compute the specular term if NdotL is larger than zero */
if (fRDotV > 0.0)
{
specular = vec4(0.49,0.48,0.49,1.0) * pow(fRDotV,8.0);
}
gl_FragColor = ambient + fNDotL * diffuse + specular;
}
5. 效果图

RenderMonkey 练习 第二天 【opengl 光照模型】的更多相关文章
- RGBA HSB opengl光照模型
RGBA HSB HSV颜色模型对应于画家的配色的方法.画家用改变色浓和色深的方法来从某种纯色获得不同色调的颜色.其做法是:在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白 ...
- OpenGL ES 光照模型之——环境光照(RenderMonkey测试)
概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...
- 【转】OpenGL基础图形编程(二)
原文:http://blog.chinaunix.net/uid-20638550-id-1909184.html 分类: 十一.位图与图像 11.1.位图 11.1.1 位图(Bitmap)与字符 ...
- openGL光源概念
1. 光照模型 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——每个光源都能对场景提供环境光.此外,还有一个环境光,它不来自 ...
- C#+OpenGL编程之再见小桃子(The Tao Framework)
本文基础: C#+OpenGL编程之OpenGL 纹理载入 C#+OpenGL编程之OpenGL 多重纹理 小桃子The Tao FrameworkTao提供的所有库都是完全开源的.其中的多数库都可以 ...
- Android OpenGL ES 开发教程 从入门到精通
感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...
- OpenGL + MFC
OpenGL超级宝典(中文版) 2001年 本书是一本完整而详尽的关于OpenGL的参考书,全书分为四部分:第一部分“OpenGL导言”介绍3D图形学的基本原理,读者将在此学会构造使用OpenGL的程 ...
- OpenGL ES 简单教程
什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. ...
- OpenGL 资源汇编
本文收集和汇总了 OpenGL 的文档.教程和在线书籍,供学习和开发者參考. OPENGL开发教程:http://www.linuxgraphics.cn/opengl/index.html Open ...
随机推荐
- VUE 实现tab切换页面效果
一 163邮箱登录tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 利用ncurses库开发终端工具箱(1)—— ToDoList小工具开发
准备工作 腾讯云服务器(Ubuntu),C++编程语言 由于想输出界面中包含中文,所以安装库 libncursesw5,依次输入下面三行命令 sudo apt-get install libncurs ...
- 197. Rising Temperature
Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to ...
- Java学习笔记(三)——静态导入,package-info,Fall-through
[前面的话] 算是真正的放松了好几天时间,没有看任何书,没有任何任务,今天是过完年后的第一天上班时间,我又开始了我的学习之路,感觉还没有老,怎么心态越来越平静了,进入工作状态,就好好努力工作,新的一年 ...
- 从零开始,学习web前端之HTML5开发
什么是HTML5 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定.是下一代 HTML 标准. 为什么要学习HTML5 HTML5定义了一系列新元素,如新语义标签 ...
- 四十八 常用内建模块 HTMLParser
如果我们要编写一个搜索引擎,第一步是用爬虫把目标网站的页面抓下来,第二步就是解析该HTML页面,看看里面的内容到底是新闻.图片还是视频. 假设第一步已经完成了,第二步应该如何解析HTML呢? HTML ...
- Python—HTTP处理Gzip压缩数据
HTTP 请求中包含Accept-encoding: gzip头信息可以告诉服务器,如果它有任何新数据要发送给我时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Co ...
- 一个菜鸟正在用SSH写一个论坛(2)
额 一不小心又一个多月没有写过随笔了. 这次是在某次启动服务器的时候报错了: 严重: Exception starting filter struts2 Unable to load configur ...
- 洛谷——P3908 异或之和
P3908 异或之和 题目描述 求1 \bigoplus 2 \bigoplus\cdots\bigoplus N1⨁2⨁⋯⨁N 的值. A \bigoplus BA⨁B 即AA , BB 按位异或. ...
- ansible学习-playbook的YAML语法
[一篇非常好的ansible参考博文] 初识Ansible http://liumissyou.blog.51cto.com/4828343/1616462 --------------------- ...