一、简单光照原理

平行光(正常光)

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

点光源

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

聚光灯

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

二、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. 自制ACL+DHCP实验(初版)

    (实验用gns模拟器) ACL 实验拓扑: 实验要求: 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤: 步骤一:基本配 ...

  2. 【1414软工助教】团队作业8——第二次项目冲刺(Beta阶段) 得分榜

    题目 团队作业8--第二次项目冲刺(Beta阶段) 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析&a ...

  3. 【2017集美大学1412软工实践_助教博客】团队作业9——测试与发布(Beta版本)

    题目 团队作业9--测试与发布(Beta版本)(http://www.cnblogs.com/happyzm/p/6917253.html) 团队作业9-1 测试与发布成绩 分值 1 0.5 0.5 ...

  4. [转载] java中静态代码块的用法 static用法详解

    一.java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序 ...

  5. 201521123110《java程序设计》第八周学习总结

    1. 本周学习总结 2. 书面作业 1.List中指定元素的删除 上课就交了,编写时主要用remove方法,然后Iterator的remove()方法可删除当前下标为i的元素后,该元素后的所有元素将往 ...

  6. 201521123098 《Java程序设计》第14周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 1. 在使用命令执行框时一定要记住大小写的区分: 2. 数据库中表的数据删除后id还是继续自增的,目前只会使用" ...

  7. 201521123071 《JAVA程序设计》第十四周学习总结

    第14周作业-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图.Onenote或其他)归纳总结多数据库相关内容. 1.使用JDBC将Java程序与数据库连接 1.1注册驱动 Class.f ...

  8. 201521123016《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) - ...

  9. Mysql中的like模糊查询

    MySql的like语句中的通配符:百分号.下划线和escape %代表任意多个字符 _代表一个字符 escape,转义字符后面的%或_,使其不作为通配符,而是普通字符匹配   数据库数据如下: 1. ...

  10. Dstl Satellite Imagery Feature Detection-Data Processing Tutorial

    如何读取WKT格式文件 我们找到了这些有用的包: Python - shapely.loads() R - rgeos 如何读取geojson格式文件 我们找到了这些有用的包: Python -  j ...