音视频开发(三十六):光照基础的具体实践
2023-09-14 09:05:30 时间
上一篇我们学习实践了关照基础的基本概念和立方体的实现。有不清楚的可以先进行回看。
这篇我们来光照基础的具体实践
一、光照基础实践
原始立方体效果
1.1、环境光(Ambient Lightiing)
//顶点着色器
uniform vec3 lightColor;
void main()
{
...
// 环境光
//光照强度
float ambientStrength = 0.3;
ambient = ambientStrength * lightColor;
...
}
//片源着色器
varying vec3 ambient;
void main()
{
vec4 color = texture2D(uTexture, v_texCoord);
vec3 finalColor = ambient * vec3(color);
gl_FragColor = min(vec4(finalColor, color.a),vec4(1.0));
}
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
在Render中传入lightcolor即可
GLES20.glEnableVertexAttribArray(ulightcolorLoc)
//环境光,xyz坐标上的值
GLES20.glUniform3f(ulightcolorLoc,1.0f,1.0f,1.0f)
加入环境光后效果如下
1.2 漫反射光(Diffuse Lighting)
//顶点的法向量
attribute vec3 aNormal;
//模型矩阵
uniform mat4 uModelMatrix;
//光源位置
uniform vec3 lightPos;
void main()
{
...
// 漫反射
float diffuseStrength = 0.8;
//顶点的单位法线
vec3 unitNormal = normalize(vec3(uModelMatrix * vec4(aNormal, 1.0)));
//从顶点到光源的单位向量
vec3 lightDir = normalize(lightPos - fragPos);
//上面来两个向量进行点乘
float diff = max(dot(unitNormal, lightDir), 0.0);
diffuse = diffuseStrength * diff * lightColor;
...
}
Render中修改如下
//设置每个顶点的法向量
GLES20.glEnableVertexAttribArray(aNormalCoorLoc)
cubeLight.vertexArrayBuffer.position(CubeLight.POSITION_COMPONENT_COUNT+CubeLight.POSITION_TEXTURE_COUNT)
GLES20.glVertexAttribPointer(aNormalCoorLoc,CubeLight.POSITION_NORMAL_COUNT,GLES20.GL_FLOAT,false,CubeLight.STRIDE, cubeLight.vertexArrayBuffer)
//设置光照点
GLES20.glEnableVertexAttribArray(ulightPosLoc)
GLES20.glUniform3f(ulightPosLoc,3.0f,0.0f,1.0f)
顶点数据在上一篇的基础上加入法向量
val vertexData = floatArrayOf(
//position //texture coord //normal
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 0.0f, -1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 0.0f, -1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f
)
环境光+漫反射光后效果如下
我们设置的光源位置在x轴的正3和y轴的正1位置,所以看到的立方体右侧的平面会有光照效果,而其他面影响很小。
1.3、镜面反射光(Specular Lighting)
//顶点着色器代码添加镜面反射
//镜面反射
float specularStrength = 0.9;
//视角和顶点的单位向量
vec3 viewDir = normalize(viewPos - fragPos);
//调用reflect反射内置函数
vec3 reflectDir = reflect(-lightDir, unitNormal);
float spec = pow(max(dot(unitNormal, reflectDir), 0.0), 16.0);
specular = specularStrength * spec * lightColor;
//设置光照点
GLES20.glEnableVertexAttribArray(ulightPosLoc)
GLES20.glUniform3f(ulightPosLoc,3.0f,0.0f,2.0f)
//设置镜面反射 视点位置
GLES20.glEnableVertexAttribArray(uViewPosLoc)
GLES20.glUniform3f(uViewPosLoc,-1.0f, 0.0f, 3.0f)
环境光+镜面反射光后效果如下
最后看下 三种光照同时作用于立方体的效果
本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓
相关文章
- SpringMVC基础-12-异常处理
- Java实现 蓝桥杯VIP 基础练习 时间转换
- Java实现 蓝桥杯VIP 基础练习 完美的代价
- 前端学习--认识,注释,基础,进制,乱码,实体
- 零基础学java-2,开发环境搭建
- Linux基础之命令行浏览器links
- 大数据基础之Hive(5)性能调优Performance Tuning
- 《安富莱嵌入式周报》第299期:IAR发布嵌入式软开发基础问题PDF,树莓派单片机运行Verilog,纯汇编实现的游戏, 电磁辐射频谱图, 乐鑫ESP32-P4
- 零基础也能开发小程序-用云开发低代码实现我的预约功能
- Android kotlin 系列讲解(基础篇) 嵌套类、内部类和匿名内部类
- 猿创征文|Python基础——Visual Studio版本——Web开发
- 〖Python语法进阶篇⑮〗- 综合实战 - 抽奖系统之基础功能开发 - base用户相关功能实现
- ios直播开发基础,推流协议及流程
- 云小课|MRS基础原理之Hudi介绍
- 让垃圾分类开发“极快致简”的好物件,零基础的开发小白也能轻松驾驭它!
- [JAVA · 0基础]:3.转义字符
- Swift基础使用方法(Swift开发之中的一个)
- 【Python 八股文】- 消息队列基础
- 操作系统和网络基础
- 009-多线程-基础-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放
- Java开发基础入门之Java基础中的Stack类及其常用方法
- web前端框架Javascript开发基础之JavaScript作用域
- Java开发基础入门之Java基础中的Stack类及其常用方法
- MySQL基础篇 | 经典三十四道练习题
- 【软考】信息系统开发基础 - UML
- 【软考】信息系统开发基础 - 信息系统/软件开发方法
- 【C++】第一篇 (基础)基本语句
- FPGA开发基础篇之一(接口篇)UART串口
- [ Azure | Az-900 ] 基础知识点总结(二) - 核心组件服务
- Linux基础入门到精通之虚拟机中安装Linux系统(二)