OpenGL在frag着色器中模拟手电筒效果
在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079)
思路如下:
- 按照理论,任何光都可以模拟本文中的手电筒。
- 点光源的本质是光照由一个点向外扩散,照射的越远光照越弱。
- 本文不考虑手电筒倾斜照射,本文照射范围将为一个标准圆。
代码如下:
#iChannel0"file://./wall.jpeg"float getVal(vec2 uv)
{return length(texture(iChannel0,uv).xyz);
}vec2 getGrad(vec2 uv,float delta)
{vec2 d=vec2(delta,0);return vec2(getVal(uv+d.xy)-getVal(uv-d.xy),getVal(uv+d.yx)-getVal(uv-d.yx))/delta;
}// 随着时间流逝,来模拟点光源动态移动
float msin()
{return sin(iTime)*1.0 + 0.5;
}void mainImage( out vec4 fragColor, in vec2 fragCoord)
{vec2 uv = fragCoord.xy / iResolution.xy;vec3 n = vec3(getGrad(uv, 1.0/iResolution.y), 150.0);n = normalize(n);fragColor = vec4(n,1);// 设计一个点光源, 坐标在(0.5, 0.5)中心位置, 由于uv纹理是[0.0, 1.0]范围的vec2 p = vec2(msin(), 0.5);// 计算uv和p的距离vec2 d = p-uv;// 光源方向vec3 ligthDir = vec3(d, 0.225);// 计算光照在uv像素上面的强度, 因为越近的应该越强, 所以使用除法.length计算的是长度float q = 0.4/length(ligthDir.xyz);// 光源颜色vec3 ligthColor = vec3(0.9922, 0.4667, 0.1137);// 漫反射+光源强度vec3 diffuse = ligthColor * max(dot(n, normalize(ligthDir)), 0.0) * q;// 纹理贴图vec4 color = texture(iChannel0, uv);// 在点光源半径范围内float r = 0.2;if(length(d.xy) <= r) {fragColor = vec4(diffuse * color.rgb, 1.0);}else {fragColor = vec4(diffuse * color.rgb * 0.1, 1.0);}
}
原图如下:
效果如下:
效果链接
OpenGL在frag着色器中模拟手电筒效果相关推荐
- OpenGL在frag着色器中模拟点光源
在3D世界中,模拟点光源实现对墙壁的光照.效果还是非常不错的. 思路如下: 准备一张墙壁图像. 自动生成墙壁的法线纹理. 模拟点光源. 添加漫反射. 随着时间变换进行规律性移动. 代码如下: #iCh ...
- Qt OpenGL(09)在着色器中实现旋转的彩色正方体
文章目录 在着色器中实现旋转的彩色正方体 旋转矩阵 沿x轴旋转: 沿y轴旋转: 沿z轴旋转: 在顶点着色器中实现 顶一个vec3的变量 theta 计算余弦和正弦值 定义3个旋转矩阵 最终代码 在着色 ...
- OpenGL使用计算着色器进行布料模拟
OpenGL使用计算着色器进行布料模拟 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include &quo ...
- Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释
图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...
- OpenGL ES像素着色器
OpenGL ES像素着色器 原文 http://www.tairan.com/archives/7509 目 录 准备开始 像素着色器 vs 顶点/片段着色器 像素着色器101:渐变 像素着色器 ...
- OpenGL ES像素着色器教程
OpenGL ES像素着色器教程 时间 2014-08-27 09:54:51 泰然 原文 http://www.tairan.com/archives/7509 主题 OpenGL ES ...
- OpenGL学习之着色器详解
OpenGL着色器语言(GLSL)看上去很像C语言,它由OpenGL实现进行编译和连接,并且(经常是)完全在图形硬件中运行. 我们有顶点着色器.片段着色器和几何着色器,前两种是必需的,后一种是可选的. ...
- 第二十二章 opengl之高级OpenGL(几何着色器)
OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...
- 【OpenGL ES】着色器Shader与程序Program
在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...
最新文章
- 斯坦福团队是如何构建更好用的聊天 AI 呢?
- 《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)
- Niblack二值化方法的实现
- qmake 没有生成.o文件_qmake实用变量
- 微信小程序集成腾讯云 IM SDK
- fopen_s不接受两个参数_如何利用SPC来管理制造过程,不懂SPC还敢混“质”场?
- 微软 Chromium Edge 禁用 Google?
- 堆、栈及静态数据区详解
- lnmp部署 -----1
- arcpy 基于python制作六十进制与十进制互换的工具箱
- boot spring 获取请求端口浩_Spring boot 无端口模式启动
- Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
- Apache roller
- 挨踢部落故事汇(9):女程序媛的开发梦
- html打印自定义页头,CSS实现打印网页自定义页眉页脚
- 优漫动游:如何解决Adobe XD无法拖入图片?
- 音视频行业玩家必读,如何实现生态合作+商业变现
- html标签中文字换行
- HTTP的几种请求方法
- TVS管的参数理解与选型
热门文章
- 4.SELECT DISTINCT 语句
- opencv3.10加入OPENCV_contrib模块
- 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable
- Ubuntu12.10-amd64系统上搭建Android4.2(JellyBean)源码开发环境
- MATLAB中squeeze函数的作用
- extern c用法解析
- CentOS启用sudo方法
- Linux /dev目录详解
- ubuntu查看系统位数,版本号——百度
- 云炬创业政策学习笔记20210116