在[OpenGL在frag着色器中模拟点光源]的基础上进行修改,得到手电筒效果(https://blog.csdn.net/qq_37340753/article/details/105029079)

思路如下:

  1. 按照理论,任何光都可以模拟本文中的手电筒。
  2. 点光源的本质是光照由一个点向外扩散,照射的越远光照越弱。
  3. 本文不考虑手电筒倾斜照射,本文照射范围将为一个标准圆。

代码如下:

#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着色器中模拟手电筒效果相关推荐

  1. OpenGL在frag着色器中模拟点光源

    在3D世界中,模拟点光源实现对墙壁的光照.效果还是非常不错的. 思路如下: 准备一张墙壁图像. 自动生成墙壁的法线纹理. 模拟点光源. 添加漫反射. 随着时间变换进行规律性移动. 代码如下: #iCh ...

  2. Qt OpenGL(09)在着色器中实现旋转的彩色正方体

    文章目录 在着色器中实现旋转的彩色正方体 旋转矩阵 沿x轴旋转: 沿y轴旋转: 沿z轴旋转: 在顶点着色器中实现 顶一个vec3的变量 theta 计算余弦和正弦值 定义3个旋转矩阵 最终代码 在着色 ...

  3. OpenGL使用计算着色器进行布料模拟

    OpenGL使用计算着色器进行布料模拟 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include &quo ...

  4. Unity Shader:细分着色器(Tessellation Shader)在Unity顶点着色器中的写法以及各参数变量解释

    图1:在Unity内将sphere细分后 图2:在Unity内将sphere细分后 Unity官网关于细分着色器的资料比较少,只有在Surface Shader中使用的例子.我看了下Surface S ...

  5. OpenGL ES像素着色器

    OpenGL ES像素着色器 原文   http://www.tairan.com/archives/7509 目 录 准备开始 像素着色器 vs 顶点/片段着色器 像素着色器101:渐变 像素着色器 ...

  6. OpenGL ES像素着色器教程

    OpenGL ES像素着色器教程 时间 2014-08-27 09:54:51   泰然 原文   http://www.tairan.com/archives/7509 主题  OpenGL ES ...

  7. OpenGL学习之着色器详解

    OpenGL着色器语言(GLSL)看上去很像C语言,它由OpenGL实现进行编译和连接,并且(经常是)完全在图形硬件中运行. 我们有顶点着色器.片段着色器和几何着色器,前两种是必需的,后一种是可选的. ...

  8. 第二十二章 opengl之高级OpenGL(几何着色器)

    OpenGL 使用几何着色器 用点造物体 爆破物体 法向量可视化 在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点 ...

  9. 【OpenGL ES】着色器Shader与程序Program

    在OpenGL ES 3程序中,Shader和Program是两个重要的概念,至少需要创建一个顶点Shader对象.一个片段Shader对象和一个Program对象,才能用着色器进行渲染,理解Shad ...

最新文章

  1. 斯坦福团队是如何构建更好用的聊天 AI 呢?
  2. 《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)
  3. Niblack二值化方法的实现
  4. qmake 没有生成.o文件_qmake实用变量
  5. 微信小程序集成腾讯云 IM SDK
  6. fopen_s不接受两个参数_如何利用SPC来管理制造过程,不懂SPC还敢混“质”场?
  7. 微软 Chromium Edge 禁用 Google?
  8. 堆、栈及静态数据区详解
  9. lnmp部署 -----1
  10. arcpy 基于python制作六十进制与十进制互换的工具箱
  11. boot spring 获取请求端口浩_Spring boot 无端口模式启动
  12. Oracle数据库出现“本地计算机上的OracleOraDB11g_homeTNSListener服务启动后停止.....”问题解决方案...
  13. Apache roller
  14. 挨踢部落故事汇(9):女程序媛的开发梦
  15. html打印自定义页头,CSS实现打印网页自定义页眉页脚
  16. 优漫动游:如何解决Adobe XD无法拖入图片?
  17. 音视频行业玩家必读,如何实现生态合作+商业变现
  18. html标签中文字换行
  19. HTTP的几种请求方法
  20. TVS管的参数理解与选型

热门文章

  1. 4.SELECT DISTINCT 语句
  2. opencv3.10加入OPENCV_contrib模块
  3. 【linux】虚拟机安装centos后ping ip地址出现错误:Network is unreachable
  4. Ubuntu12.10-amd64系统上搭建Android4.2(JellyBean)源码开发环境
  5. MATLAB中squeeze函数的作用
  6. extern c用法解析
  7. CentOS启用sudo方法
  8. Linux /dev目录详解
  9. ubuntu查看系统位数,版本号——百度
  10. 云炬创业政策学习笔记20210116