一、简单光照原理

平行光(正常光)

  光照效果=   环境颜色 + 漫反射颜色 + 镜面反射颜色

点光源

  光照效果=   环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子

聚光灯

  光照效果=   环境颜色 + (漫反射颜色 + 镜面反射颜色)× 衰减因子 × 聚光灯效果

二、IOS光照

1、导入系统库

  • GLKit
  • OpenGLES
  • CoreGraphics
  • QuartzCore

2、光照类

  1. #import <GLKit/GLKit.h>
  2. //基础光
  3. @interface BaseLight : NSObject{
  4. @public GLKVector4 Color;
  5. float AmbientIntensity;//周围无光照的区域亮度
  6. float DiffuseIntensity;//漫反射
  7. float SpecularIntensity;//镜面反射
  8. }
  9. @end
  10. //点光源
  11. @interface PointLight : BaseLight{
  12. @public GLKVector3 DestPos;
  13. GLKVector3 SourcePos;//光照源位置
  14. float Shininess;
  15. struct
  16. {
  17. float Constant;
  18. float Linear;
  19. float Exp;
  20. } Attenuation;
  21. }
  22. @end
  23. //聚光灯
  24. @interface SpotLight : PointLight{
  25. @public GLKVector3 Direction;
  26. float Cutoff;//最小夹角cos值
  27. float Exponent;//聚光灯角度
  28. }
  29. @end

3、实现光源属性槽位获取及更新

  1. @interface BaseLight : NSObject{
  2. @public GLKVector4 Color;
  3. float AmbientIntensity;//周围无光照的区域亮度
  4. float DiffuseIntensity;//漫反射
  5. float SpecularIntensity;//镜面反射
  6. }
  7. @end
  8. @interface PointLight : BaseLight{
  9. @public GLKVector3 DestPos;
  10. GLKVector3 SourcePos;//光照源位置
  11. float Shininess;
  12. struct
  13. {
  14. float Constant;
  15. float Linear;
  16. float Exp;
  17. } Attenuation;
  18. }
  19. @end
  20.  
  21. @interface SpotLight : PointLight{
  22. @public GLKVector3 Direction;
  23. float Cutoff;//最小夹角cos值
  24. float Exponent;//聚光灯角度
  25. }
  26. @end

在实际项目中调用,初始化,设置,然后更新。。。。

4、GLSL实现

  1. //基础光
  2. struct BaseLight
  3. {
  4. vec4 Color;
  5. float AmbientIntensity;
  6. float DiffuseIntensity;
  7. float SpecularIntensity;
  8. };
  9. //点光源
  10. struct PointLight{
  11. BaseLight Base;
  12.  
  13. vec3 SourcePos;
  14. vec3 DestPos;
  15. float Shininess; //亮度
  16. struct
  17. {
  18. float Constant;
  19. float Linear;
  20. float Exp;
  21. } Attenuation;
  22. };
  23. //聚光灯
  24. struct SpotLight{
  25. PointLight Base;
  26. vec3 Direction;
  27. float Cutoff;
  28. float Exponent;
  29. };
  30.  
  31. vec3 vPos;
  32. vec3 vEyePos;
  33.  
  34. uniform SpotLight u_spotLight;
  35.  
  36. //基础光计算
  37. vec4 CalcLightInternal(BaseLight Light, vec3 LightDirection, vec3 Normal)
  38. {
  39. float DiffuseFactor = dot(Normal, LightDirection);
  40. vec4 DiffuseColor = vec4(, , , );
  41. vec4 SpecularColor = vec4(, , , );
  42. if (DiffuseFactor > 0.0) {
  43. DiffuseColor = Light.Color * Light.DiffuseIntensity * DiffuseFactor;
  44. vec3 VertexToEye = normalize(vEyePos - vPos);
  45. vec3 LightReflect = normalize(reflect(LightDirection, Normal));
  46. vec3 H = normalize(LightDirection + VertexToEye);
  47. float SpecularFactor = max(0.0, dot(Normal, H));
  48. SpecularFactor = pow(SpecularFactor, 10.0);
  49. if (SpecularFactor > 0.0) {
  50. SpecularColor = Light.Color *
  51. Light.SpecularIntensity * SpecularFactor;
  52. }
  53. }
  54. return DiffuseColor + SpecularColor;
  55. }
  56.  
  57. //pointlight 点光源计算
  58. vec4 CalcPointLight(PointLight l,vec3 Normal)
  59. {
  60. vec3 LightDirection = normalize(l.SourcePos-l.DestPos);
  61. float Distance =length(vPos - l.DestPos);
  62. vec4 Color = CalcLightInternal(l.Base, LightDirection, Normal);
  63. //衰减因子
  64. float Attenuation = l.Attenuation.Constant +l.Attenuation.Linear * Distance +
  65. l.Attenuation.Exp* Distance * Distance;
  66. Color=Color*l.Shininess/Attenuation;
  67. return Color;
  68. }
  69. //spotlight实现
  70. vec4 CalcSpotLight(SpotLight l, vec3 Normal)
  71. {
  72. vec3 LightToPixel = normalize(vPos - l.Base.DestPos);
  73. vec3 LightDirection = normalize(LightToPixel-l.Direction);
  74. //聚光灯因子
  75. float SpotFactor =pow(max(0.0, dot(LightToPixel, LightDirection)),l.Exponent);
  76. if (SpotFactor > l.Cutoff) {
  77. vec4 Color = CalcPointLight(l.Base, Normal);
  78. return Color * clamp((1.0 - (1.0 - SpotFactor) * 1.0/(1.0 - l.Cutoff)),0.0,1.0);
  79. }
  80. else {
  81. return vec4(0.0,0.0,0.0,0.0);
  82. }
  83. }
  84.  
  85. void main()
  86. {
  87. lowp vec4 topColor = texture2D(Texture, TexCoordOut);
  88.  
  89. vec3 vNormal=vec3(, , );
  90. vec3 N = normalMatrix * vNormal;
  91. vPos=vec3(TexCoordOut,0.0) ; //取光照点
  92. vEyePos=vec3(0.0,0.0,1.0);//观察点
  93. vec4 AmbientColor = u_spotLight.Base.Base.Color * u_spotLight.Base.Base.AmbientIntensity;
  94.  
  95. lowp vec4 lightColor =CalcSpotLight(u_spotLight,N)+CalcSpotLight(u_spotLight1,N)+AmbientColor;
  96. gl_FragColor =lightColor* topColor;
  97.  
  98. }

OpenGL ES2.0光照的更多相关文章

  1. Cocos2d-x中使用OpenGL ES2.0编写shader

    这几天在看子龙山人的关于OpenGL的文章,先依葫芦画瓢,能看到些东西,才能慢慢深入了解,当入门文章不错,但是其中遇到的一些问题,折腾了一些时间,为了方便和我一样的小白们,在这篇文章中进行写补充. O ...

  2. iOS开发——图形编程OC篇&OpenGL ES2.0编程步骤

    OpenGL ES2.0编程步骤 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设 ...

  3. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    原文地址: Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤 - 网络资源是无限的 - 博客频道 - CSDN.NET http://blog.csdn.net/fen ...

  4. OpenGL ES2.0入门详解

    引自:http://blog.csdn.net/wangyuchun_799/article/details/7736928  1.决定你要支持的OpenGL ES的版本.目前,OpenGL ES包含 ...

  5. OPENGL ES2.0如何不使用glActiveTexture而显示多个图片

    https://www.oschina.net/question/253717_72107 用opengl es 2.0显示多个图片的话,我只会一种方式,先将图片生成纹理,然后用下面的方式渲染 // ...

  6. Android +NDK+eclipse+opengl ES2.0 开启深度測试

    參考:https://www.opengl.org/discussion_boards/showthread.php/172736-OpenGL-ES-Depth-Buffer-Problem 环境: ...

  7. OpenGL ES2.0 基本编程

    1. EGL OpenGL ES命令须要一个rendering context和一个drawing surface. Rendering Context: 保存当前的OpenGL ES状态. Draw ...

  8. OpenGL ES2.0 入门经典例子

    原文链接地址:http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial 免责申明(必读!):本博客提供的所有教程的翻译原稿 ...

  9. OpenGL ES2.0基础入门

    1.OpenGL ES 1.x渲染管线(又称为渲染流水线) (1).基本处理: 基本处理主要是设定3D空间中物体的顶点坐标.顶点对应的颜色.顶点的纹理坐标等属性,并且指定绘制方式. 常见的绘制方式有: ...

随机推荐

  1. (转)C语言malloc()与free()的使用

    如何使用 malloc 函数 本文为转载内容,原文地址请点击 不要莫名其妙,其实上面这段小小的对话,就是malloc的使用过程.malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要 ...

  2. SNS团队第六次站立会议(2017.04.27)

    一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 导入相关词库数据  研究如何存取语音.图片文件 龚晓 ...

  3. 团队作业4---第一次项目冲刺(ALpha)版本 第六天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 a.完成所有基础功能 b.正在进行测试调试 四.困难与问题 1.测试前没有理清业务逻辑,导致前期测试深度不够: 2.在验证过去 ...

  4. LaTeX排版指南

    V0.0.1 工具链 CTeX:http://www.ctex.org/HomePage ,CTeX是一个中文套装,但也同时发布一个独立的ctex宏包 TeXLive:https://tug.org/ ...

  5. ajax中后台string转json

    首先导入alibaba的fastJson包 后台: String thirdPage1=prop.getProperty("thirdPage1"); String thirdPa ...

  6. Quartz2.2.x官方教程

    零.Quartz是什么?能干什么? Quartz是一个开源的任务调度框架.基于定时.定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次.Quartz有3个 ...

  7. 201521123087 《Java程序设计》第2周学习总结

    1.本周学习总结 类名第一个字母大写,类名下的方法如main第一个字母要小写: Java有三种基本数据类型:整型(byte,short,int,long,char),浮点型(float,double) ...

  8. java课程设计--WeTalk(201521123076)

    在线群聊系统 1,团队课程设计博客链接 http://www.cnblogs.com/slickghost/p/7018105.html 个人负责模块或任务说明 负责模块:总体设计及主要聊天功能实现 ...

  9. 201521123104《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用sync ...

  10. 利用Vim提供的正则去掉代码每行开头不想要的行号以及vi常见问题和应用技巧

    看到一不错的代码片断,但奈何无论怎么拷贝,粘贴到VS里都是带行号的,300多行的代码手工删除行号与前面的空格可得耗不少时间...这时想起了无所不能的VIM,以及它的正则,它的替换功能.解决步骤: 1. ...