OpenGlES--光照

1、环境光

环境光照射结果=材质的反射系数*环境光强度(Ambient)

在片元着色器中 即:FragColor = Color (物体颜色)* Ambient * 材质的反射系数

2、散射光

散射光照射结果=材质的反射系数*散射光强度*max(cos(入射角),0)

在开发中将其分解为两步:

散射光最终强度=散射光强度*max(cos(入射角),0)

散射光照射结果=材质的反射系数*散射光最终强度

在顶点着色器中:

uniform mat4 MVP;

uniform mat4 M;

uniform vec3 lightPosition;

in vec3 Position;

in vec3 Normal;

out vec4 diffuseTemp;


vec3 normalTarget = Position + Normal;

vec3 newNormal = (M * vec4(normalTarget,1)).xyz - (M * vec4(Position,1)).xyz;

newNormal = normalize(newNormal);//法向量

//点到点光源的向量

vec3 pointTOlight = normalize(lightPosition - ((M * vec4(Position,1)).xyz));

vec4 diffuseTemp = LightDiffuse(散射光强度)*max(0.0,dot(newNormal,pointTOlight));//散射光最终强度=散射光强度*max(cos(入射角),0)

在片元着色器中:

FragColor = Color (物体颜色)* diffuseTemp * 材质的反射系数

3、镜面光

镜面光照射结果=材质的反射系数*镜面光强度*max(0,(cos(半向量与法向量的夹角)))

在开发中将其分解为两步:

镜面光最终强度=镜面光强度*max(0,(cos(半向量与法向量的夹角)))

镜面光照射结果=材质的反射系数*镜面光最终强度

在顶点着色器中:

uniform mat4 MVP;

uniform mat4 M;

uniform vec3 lightPosition;

uniform vec3 eyePosition;

in vec3 Position;

in vec3 Normal;

out vec4 specular ;


vec3 normalTarget = Position + Normal;

vec3 newNormal = (M * vec4(normalTarget,1)).xyz - (M * vec4(Position,1)).xyz;

newNormal = normalize(newNormal);//法向量

//点到点光源的向量

vec3 pointTOlight = normalize(lightPosition - ((M * vec4(Position,1)).xyz));

//点到摄像机的向量

vec3 pointTOeye = normalize(eyePosition - ((M * vec4(Position,1)).xyz));

//粗糙度

float shininess = 50.0f;

vec3 half = normalize(pointTOlight + pointTOeye );

vec4 specular = LightSpecular(镜面光强度) * max(0.0,pow(dot(newNormal ,half),shininess));

在片元着色器中:

FragColor = Color (物体颜色)* specular * 材质的反射系数

4、三光合一

在片元着色器中:

FragColor = Color (物体颜色)* Ambient * 材质的反射系数+Color (物体颜色)* diffuse* 材质的反射系数+Color (物体颜色)* specular * 材质的反射系数

5、方向光

传入方向光向量,在顶点着色器中,vec3 pointTOlight = LightDierction  ,之后计算过程相等。

6、点法向量与面法向量

点法向量:适用于球等表面光滑的模型,向量参考球的向量

面法向量:适用于表面不光滑的模型,如立方体等。其向量构建方法为一个点多次输入,多次更新对应面的法向量。其等于在一个位置存在多个位置坐标相同但是法向量不同的点,一个点对应一个面。

7、片元着色器中计算光照

顶点着色器:计算速度快,但效果差于片元着色器中计算。

片元着色器:计算速度慢,光照效果好,更加细腻,光照过度平滑,没有明显的边缘。

方法:顶点着色器接受到normal后,直接传入片元着色器,然后将光照的计算部分移入片元着色器中。

(图片待续)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值