OpenGL聚光灯实现注解
#version 430 coreuniform vec4 Ambient; //环境光uniform vec3 LightColor; //聚光灯颜色
uniform vec3 LightPosition; //聚光灯位置
uniform vec3 SoptDirection; //聚光灯中心灯光方向
uniform float SoptCosCutoff; //聚光灯范围
uniform float SoptExponent; //聚光灯指数
uniform float Shininess;
uniform float Strength; //强度 uniform vec3 EyeDirection; //视线方向
uniform float Attionuation; //衰减系数in vec4 color;
in vec3 Normal;
in vec4 Pos;out vec4 FragColor;void main()
{//从聚光灯指向片元的向量vec3 lightDir = vec3(Pos.xyz) - LightPosition;//聚光灯和片元距离 float len = length(lightDir);//规一化lightDir = normalize(lightDir);//减,相当于加上反方向,半角向量vec3 HalfVector = normalize(EyeDirection - lightDir);//根据距离求出衰减值float Attenua = 1 / (Attionuation*(1.0+len*len));//漫反射 相当于max(0.0f, dot(Normal, -lightDir)) *0.6float diffuse = max(0.0f, -1*dot(Normal, lightDir)) *0.6;//镜面高光float specular = max(0.0f,dot(Normal, HalfVector));//基本平行时没有高光if(diffuse <= 0.00001)specular = 0.0f;elsespecular = pow(specular, Shininess);//cos夹角值 float Spotcos = dot(SoptDirection, lightDir);//夹角越大,cos值越小,大于聚光灯范围时没有聚光灯效果 if(Spotcos < SoptCosCutoff){Attenua = 0.0f;}else{//specular *= pow(Spotcos, SoptExponent);specular *= ((Spotcos-1)/(1-SoptCosCutoff) + 1 )*2.0*Strength;}//环境光加漫反射 vec4 scatteredLight = Ambient + vec4(LightColor * diffuse*Attenua, 0.0); //高光vec4 ReflectLight = vec4(LightColor*specular*Attenua, 0.0);//最终颜色 FragColor = min(color*scatteredLight + ReflectLight, vec4(1.0));}
OpenGL聚光灯实现注解相关推荐
- Avoiding 16 Common OpenGL Pitfalls(避免 16 个常见的 OpenGL 陷阱)
前言 避免 16 个常见的 OpenGL 陷阱原文 Avoiding 16 Common OpenGL Pitfalls Copyright 1998, 1999 by Mark J. Kilgard ...
- OpenGL完整教程专栏完整目录
OpenGL完整教程专栏完整目录 专栏说明如下 专栏目录 专栏说明如下 内容:OpenGL完整教程 数量:314篇博文(2023年2月15日截止) 更新时间至:2023年2月15日(后续加上去的博文, ...
- 【OpenGL】光照太阳系
一.要求 二.思路 0.效果图 1.实现基本的太阳系 采用局部变换的思路完成,实现太阳.地球.月亮及轨道的绘制 2.宇宙中加入一盏泛光(方向光) 加入思路: 1)设置好物体的法向 在这里可以不进行设置 ...
- OpenGL基础24:聚光灯
前置:OpenGL基础23:平行光与点光源 一.聚光灯 三种基础光源在上一章讲了2种,现在只剩下聚光灯了 手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点 依然有衰减,但是聚光灯的光照一般都 ...
- opengl光照之聚光灯
聚光灯原理:(可想象成探照灯) 运行效果图 片元shader uniform vec4 U_LightPos;//光源位置 uniform vec3 U_EyePos;//眼睛的位置 uniform ...
- OpenGL(十二) 光源类型 平行光 、 点光源 、 聚光灯 的实现
常规的 光源类型 有三种.最简单的自然是平行光.稍复杂些的为点光源,最复杂的为聚光灯.总体说来,在可编程管线中原理是一样的.在OpenGL代码中传入必要的参数,在shader中进行相关的计算绘制出效果 ...
- opengl对三种光源(方向光,点光源,聚光灯)进行特写并分屏渲染
分屏特写渲染效果图 实现原理 1,创建3个fbo 2,分别将方向光,点光源,聚光灯的照射效果渲染到fbo 3,在将渲染好的三个fbo作为纹理贴到要绘制的三个四边形上. 渲染入口 #include &l ...
- opengl 教程(21) 聚光灯
原帖地址:http://ogldev.atspace.co.uk/www/tutorial21/tutorial21.html 本篇教程中,我们来学习聚光灯的的光照效果,聚光灯有光源位置,也会随着传播 ...
- OpenGL教程翻译 第二十一课 聚光灯
第二十一课 聚光灯 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) 背景 聚光灯是第三个也是最后一个我们将要介绍的光源类型(至少在一段时间内).他比平行光和 ...
最新文章
- 18 款顶级代码生成器平台!
- JTable是Swing编程中很常用的控件
- 独家 | 播客:入场券便是你的脸(附链接)
- 发表了一篇英文长文:语义信息G理论和逻辑贝叶斯推理for统计学习
- 对数据进行递归排序以树状显示
- 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)
- MySQL基本操作(表,字段)
- 浅谈MIPS地址对齐问题
- aix oracle监听配置_AIX系统中安装ORACLE,客户端连接时,监听会宕掉的问题
- HashMap的结构及源码分析
- 计算机怎么把硬盘分成几个,如何把电脑的一个盘的容量分给另外一个盘
- ifconfig输出网口和ip
- JSON字符串与Map互转
- poi 灵活导出excel(有这一篇即可~~~~)
- diy服务器个人主机_DIY双路服务器之个人主机
- linux重启数据库11g,linux下重启oracle数据库
- 电脑硬盘分区不见了怎么恢复数据?
- Chrome终极全屏模式Kiosk
- iTween 用法总结
- 代码理解网络选择候选区域及确定最终目标框的过程
热门文章
- 【MATLAB】基于MATLAB实现灯光定位
- 2023大连理工大学考研分析
- centos7下svnserve方式部署subversion/SVN服务端(实操)
- 苹果Windows装oracle10,联想笔记本装Win8和MacOS10.9双系统安装教程
- 计算机软件流控制com,电脑控(com.pw.pccontrol) - 2.7.1 - 应用 - 酷安
- solidity 操作符01
- 使用-完美者U盘维护系统V8
- pythonhiq | 计算LiH分子的哈密顿量(ongoing)
- 商用及企业级服务器搭建之二:linux系统,linux命令
- 湖南大学校园网 TheServerIsNotResponding