一、简单光照原理

平行光(正常光)

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

点光源

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

聚光灯

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

二、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. 团队作业7---Alpha冲刺值事后诸葛

    一.设想和目标 1.我们的软件要解决什么问题? 解决教师和助教对实验报告查重的问题,拥有两个用户:1.教师或助教:查看学生实验报告的重复率:4.学生:上传实验报告. 2.是否定义得很清楚?是否对典型用 ...

  2. 201521123083《Java程序设计》第8周学习总结

    1. 本周学习总结 这周因为一些事情耽搁了,几乎没什么打java代码,这几天尽量补过来 2. 书面作业 1.List中指定元素的删除 1.1 实验总结 不贴大段代码了,简要总结一下.切割成数组,主要用 ...

  3. 团队作业4——第一次项目冲刺(Alpha版本)第六天and第七天

    团队作业4--第一次项目冲刺(Alpha版本)第六天and第七天 第一次项目冲刺(Alpha版本)第六天 一.Daily Scrum Meeting照片   二.燃尽图 1.解释说明横纵坐标代表的含义 ...

  4. 201521123018 《Java程序设计》第4周学习总结

    1. 本章学习总结 2. 书面作业 Q1.注释的应用:使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对象设计(大作业1-非常重要) 2.1 讲故事 ...

  5. 201521123034 《Java程序设计》第3周学习总结

    1. 本章学习总结 看不清点这个:http://naotu.baidu.com/file/c01303326572f7916e506ec5f55270a4 2. 书面作业 1.代码阅读 public ...

  6. update:我的Emacs配置文件

    ;;设置字体用的  防止中文变成无法识别的框框 (set-default-font "Consolas-11") (set-fontset-font "fontset-d ...

  7. java课程设计---计算器(201521123020 邱伟达)

    1.团队课程设计博客链接 http://www.cnblogs.com/br0823/p/7064407.html 2.个人负责模板或任务说明 1.初始化按键 2.实现加减乘除开方乘方等运算 3.每个 ...

  8. 自动化测试之 seleniumIDE,Selenium1,selenium2和testNG入门

    由于前期三个月公司的项目一直在改需求阶段,一直是手动测试,现在项目雏形以及基本页面功能都确定下来,为了不让自己陷入天天测同一功能的无限循环中,故开始自动化测试的学习之路,也为自己以后的发展铺铺路. 一 ...

  9. 一个非常好用的框架-AngularJS(一)

      前  言           AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.An ...

  10. 循环语句for,while,until,select

    循环 *循环执行 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 *常见的循环语句有for,while,until for循环 for 变量名 n ...