OpenGL ES2.0光照
一、简单光照原理
平行光(正常光)
光照效果= 环境颜色 + 漫反射颜色 + 镜面反射颜色
点光源
光照效果= 环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子
聚光灯
光照效果= 环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子 × 聚光灯效果
二、IOS光照
1、导入系统库
- GLKit
- OpenGLES
- CoreGraphics
- QuartzCore
2、光照类
- #import <GLKit/GLKit.h>
- //基础光
- @interface BaseLight : NSObject{
- @public GLKVector4 Color;
- float AmbientIntensity;//周围无光照的区域亮度
- float DiffuseIntensity;//漫反射
- float SpecularIntensity;//镜面反射
- }
- @end
- //点光源
- @interface PointLight : BaseLight{
- @public GLKVector3 DestPos;
- GLKVector3 SourcePos;//光照源位置
- float Shininess;
- struct
- {
- float Constant;
- float Linear;
- float Exp;
- } Attenuation;
- }
- @end
- //聚光灯
- @interface SpotLight : PointLight{
- @public GLKVector3 Direction;
- float Cutoff;//最小夹角cos值
- float Exponent;//聚光灯角度
- }
- @end
3、实现光源属性槽位获取及更新
- @interface BaseLight : NSObject{
- @public GLKVector4 Color;
- float AmbientIntensity;//周围无光照的区域亮度
- float DiffuseIntensity;//漫反射
- float SpecularIntensity;//镜面反射
- }
- @end
- @interface PointLight : BaseLight{
- @public GLKVector3 DestPos;
- GLKVector3 SourcePos;//光照源位置
- float Shininess;
- struct
- {
- float Constant;
- float Linear;
- float Exp;
- } Attenuation;
- }
- @end
- @interface SpotLight : PointLight{
- @public GLKVector3 Direction;
- float Cutoff;//最小夹角cos值
- float Exponent;//聚光灯角度
- }
- @end
在实际项目中调用,初始化,设置,然后更新。。。。
4、GLSL实现
- //基础光
- struct BaseLight
- {
- vec4 Color;
- float AmbientIntensity;
- float DiffuseIntensity;
- float SpecularIntensity;
- };
- //点光源
- struct PointLight{
- BaseLight Base;
- vec3 SourcePos;
- vec3 DestPos;
- float Shininess; //亮度
- struct
- {
- float Constant;
- float Linear;
- float Exp;
- } Attenuation;
- };
- //聚光灯
- struct SpotLight{
- PointLight Base;
- vec3 Direction;
- float Cutoff;
- float Exponent;
- };
- vec3 vPos;
- vec3 vEyePos;
- uniform SpotLight u_spotLight;
- //基础光计算
- vec4 CalcLightInternal(BaseLight Light, vec3 LightDirection, vec3 Normal)
- {
- float DiffuseFactor = dot(Normal, LightDirection);
- vec4 DiffuseColor = vec4(, , , );
- vec4 SpecularColor = vec4(, , , );
- if (DiffuseFactor > 0.0) {
- DiffuseColor = Light.Color * Light.DiffuseIntensity * DiffuseFactor;
- vec3 VertexToEye = normalize(vEyePos - vPos);
- vec3 LightReflect = normalize(reflect(LightDirection, Normal));
- vec3 H = normalize(LightDirection + VertexToEye);
- float SpecularFactor = max(0.0, dot(Normal, H));
- SpecularFactor = pow(SpecularFactor, 10.0);
- if (SpecularFactor > 0.0) {
- SpecularColor = Light.Color *
- Light.SpecularIntensity * SpecularFactor;
- }
- }
- return DiffuseColor + SpecularColor;
- }
- //pointlight 点光源计算
- vec4 CalcPointLight(PointLight l,vec3 Normal)
- {
- vec3 LightDirection = normalize(l.SourcePos-l.DestPos);
- float Distance =length(vPos - l.DestPos);
- vec4 Color = CalcLightInternal(l.Base, LightDirection, Normal);
- //衰减因子
- float Attenuation = l.Attenuation.Constant +l.Attenuation.Linear * Distance +
- l.Attenuation.Exp* Distance * Distance;
- Color=Color*l.Shininess/Attenuation;
- return Color;
- }
- //spotlight实现
- vec4 CalcSpotLight(SpotLight l, vec3 Normal)
- {
- vec3 LightToPixel = normalize(vPos - l.Base.DestPos);
- vec3 LightDirection = normalize(LightToPixel-l.Direction);
- //聚光灯因子
- float SpotFactor =pow(max(0.0, dot(LightToPixel, LightDirection)),l.Exponent);
- if (SpotFactor > l.Cutoff) {
- vec4 Color = CalcPointLight(l.Base, Normal);
- return Color * clamp((1.0 - (1.0 - SpotFactor) * 1.0/(1.0 - l.Cutoff)),0.0,1.0);
- }
- else {
- return vec4(0.0,0.0,0.0,0.0);
- }
- }
- void main()
- {
- lowp vec4 topColor = texture2D(Texture, TexCoordOut);
- vec3 vNormal=vec3(, , );
- vec3 N = normalMatrix * vNormal;
- vPos=vec3(TexCoordOut,0.0) ; //取光照点
- vEyePos=vec3(0.0,0.0,1.0);//观察点
- vec4 AmbientColor = u_spotLight.Base.Base.Color * u_spotLight.Base.Base.AmbientIntensity;
- lowp vec4 lightColor =CalcSpotLight(u_spotLight,N)+CalcSpotLight(u_spotLight1,N)+AmbientColor;
- gl_FragColor =lightColor* topColor;
- }
OpenGL ES2.0光照的更多相关文章
- Cocos2d-x中使用OpenGL ES2.0编写shader
这几天在看子龙山人的关于OpenGL的文章,先依葫芦画瓢,能看到些东西,才能慢慢深入了解,当入门文章不错,但是其中遇到的一些问题,折腾了一些时间,为了方便和我一样的小白们,在这篇文章中进行写补充. O ...
- iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤
OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设 ...
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...
- OpenGL ES2.0入门详解
引自:http://blog.csdn.net/wangyuchun_799/article/details/7736928 1.决定你要支持的OpenGL ES的版本.目前,OpenGL ES包含 ...
- OPENGL ES2.0如何不使用glActiveTexture而显示多个图片
https://www.oschina.net/question/253717_72107 用opengl es 2.0显示多个图片的话,我只会一种方式,先将图片生成纹理,然后用下面的方式渲染 // ...
- Android +NDK+eclipse+opengl ES2.0 开启深度測试
參考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境: ...
- OpenGL ES2.0 基本编程
1. EGL OpenGL ES命令须要一个rendering context和一个drawing surface. Rendering Context: 保存当前的OpenGL ES状态. Draw ...
- OpenGL ES2.0 入门经典例子
原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...
- OpenGL ES2.0基础入门
1.OpenGL ES 1.x渲染管线(又称为渲染流水线) (1).基本处理: 基本处理主要是设定3D空间中物体的顶点坐标.顶点对应的颜色.顶点的纹理坐标等属性,并且指定绘制方式. 常见的绘制方式有: ...
随机推荐
- (转)C语言malloc()与free()的使用
如何使用 malloc 函数 本文为转载内容,原文地址请点击 不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程.malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要 ...
- SNS团队第六次站立会议(2017.04.27)
一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 导入相关词库数据 研究如何存取语音.图片文件 龚晓 ...
- 团队作业4---第一次项目冲刺(ALpha)版本 第六天
一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 a.完成所有基础功能 b.正在进行测试调试 四.困难与问题 1.测试前没有理清业务逻辑,导致前期测试深度不够: 2.在验证过去 ...
- LaTeX排版指南
V0.0.1 工具链 CTeX:http://www.ctex.org/HomePage ,CTeX是一个中文套装,但也同时发布一个独立的ctex宏包 TeXLive:https://tug.org/ ...
- ajax中后台string转json
首先导入alibaba的fastJson包 后台: String thirdPage1=prop.getProperty("thirdPage1"); String thirdPa ...
- Quartz2.2.x官方教程
零.Quartz是什么?能干什么? Quartz是一个开源的任务调度框架.基于定时.定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次.Quartz有3个 ...
- 201521123087 《Java程序设计》第2周学习总结
1.本周学习总结 类名第一个字母大写,类名下的方法如main第一个字母要小写: Java有三种基本数据类型:整型(byte,short,int,long,char),浮点型(float,double) ...
- java课程设计--WeTalk(201521123076)
在线群聊系统 1,团队课程设计博客链接 http://www.cnblogs.com/slickghost/p/7018105.html 个人负责模块或任务说明 负责模块:总体设计及主要聊天功能实现 ...
- 201521123104《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用sync ...
- 利用Vim提供的正则去掉代码每行开头不想要的行号以及vi常见问题和应用技巧
看到一不错的代码片断,但奈何无论怎么拷贝,粘贴到VS里都是带行号的,300多行的代码手工删除行号与前面的空格可得耗不少时间...这时想起了无所不能的VIM,以及它的正则,它的替换功能.解决步骤: 1. ...