一、简单光照原理

平行光(正常光)

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

点光源

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

聚光灯

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

二、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光照的更多相关文章

  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. tkinter第一章

    tk1 ------------------------------------------------------------------------------------------ impor ...

  2. ServletRequest的一些知识点

    浏览器向服务器的请求(浏览器将数据发送给服务器时,数据存放的地方) 请求方式:GET和POST * GET:发送的数据,追加在请求的URL之上 * POST:发送的数据在HTTP请求体中 浏览器发送数 ...

  3. 必应词典--英语学习APP案例分析

    一.调研,评测 1.个人上手体验 这还是第一次听说必应词典,只能说知名度有待提高啊.首先,下载打开必应词典的第一感觉就是不够美观,个人感觉不论图标还是界面的美感都不足,既繁琐有简洁,给人的最直观感受就 ...

  4. 团队作业8——Beta项目(冲刺计划)

    Beta阶段冲刺计划 经过几周的努力我们完成了Alpha的开发,进过一段时间的调整与重组我们继续向Beta版进发. 1. 新成员介绍 林乔桦(201421123074):掌握c语言,JavaScrip ...

  5. 201521123008《Java程序设计》第六周实验总结

    1.本周学习总结 2.书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 因为被protected修饰 ...

  6. 201521123058 java第六次作业

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 1.clone方法 1.1 Object对 ...

  7. 201521123012 《Java程序设计》第六周学习总结

    ##1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. -注1:关键词与内容不求多,但概念之间的联系要清晰,内 ...

  8. Ubuntu下Java开发环境搭建(eclipse)

    最近把工作环境转移到了Ubuntu Kylin下,发现在这下面Java环境还是很方便的.然而也经历了一些摸索的过程,故作文以记之. 一/开发前准备 安装系统/配置软件源,这部分内容没什么需要注意的.O ...

  9. 201521123007《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  10. 201521123065《java程序设计》第14周学习总结

    1. 本周学习总结 1.大部分情况下使用的数据库是关系型的数据库,使用表存储数据: 2.关系型数据库可以通过唯一的主键查找记录,也可以通过多个信息确定主键: 3.Mysql操作:显示-show dat ...