高级光照_阴影_代码实现

根据上节阴影原理及附源码,主要是创建一个深度缓冲视图,然后将其使用到主场景Shader中,以此来实现阴影,大部分工作是在原有代码基础上进行改动,并新增了部分hpp文件来快捷创建各类所需结构体。
本小节,我们主要来讲述下阴影的shader部分:

一、深度贴图shader

首先来看顶点着色器,这也是深度贴图的主要地方,通过仅使用光照MVP矩阵来记录渲染图片中各点的深度值,然后通过二维纹理映射(sampler2D)返还给场景shader进行对比。

#version 450#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enablelayout (location = 0) in vec3 inPos;layout (binding = 0) uniform UBO
{mat4 depthMVP;mat4 model;//for test
} ubo;out gl_PerVertex
{vec4 gl_Position;
};void main()
{gl_Position =  ubo.depthMVP * vec4(inPos, 1.0);//gl_Position =  ubo.model *vec4(inPos, 1.0);
}

由于深度缓冲视图中片元着色器不关紧要,故,简单定义即可:

#version 450#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable//layout(location = 0) out vec4  FragColor;
//layout(location = 0) out float fragmentdepth;void main()
{   //fragmentdepth = gl_FragCoord.z;//FragColor = vec4(vec3(0), 1.0);
}

二、场景shader

顶点着色器:

#version 450
#extension GL_ARB_separate_shader_objects : enablelayout(binding = 0) uniform UniformBufferObject {mat4 model;mat4 view;mat4 proj;mat4 lightSpace;vec3 baseLight;float ambientStrength;vec3 lightPos;float specularStrength ;vec3 viewPos;vec3 lightDirect;vec3 flashColor;vec3 flashPos;float outerCutOff;vec3 flashDir;float flashCutOff ;
} ubo;layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inColor;
layout(location = 2) in vec3 inNormal;
layout(location = 3) in vec2 inTexCoord;
layout(location = 4) in vec3 inM_ambient;
layout(location = 5) in vec3 inM_diffuse;
layout(location = 6) in vec3 inM_specular;
layout(location = 7) in float inM_shininess;layout(location = 0) out vec3 fragColor;
layout(location = 1) out vec3 fragNormal;
layout(location = 2) out vec2 fragTexCoord;
layout(location = 3) out vec3 fragBaseLight;
layout(location = 4) out float ambientStrength;
layout(location = 5) out vec3 lightPos;
layout(location = 6) out vec3 fragPos;
layout(location = 7) out float specularStrength;
layout(location = 8) out vec3 viewPos;
//Material
layout(location = 9) out vec3 m_ambient;
layout(location = 10) out vec3 m_diffuse;
layout(location = 11) out vec3 m_specular;
layout(location = 12) out float m_shininess;
layout(location = 13) out vec3 lightDirect;
layout(location = 14) out vec3 flashPos;
layout(location = 15) out vec3 flashDir;
layout(location = 16) out float flashCutOff;
layout(location = 17) out float outerCutOff;
layout(location = 18) out vec3 flashColor;
layout(location = 19) out vec4 outShadowCoord;layout(push_constant) uniform PushConsts {vec3 objPos;
} pushConsts;const mat4 biasMat = mat4( 0.5, 0.0, 0.0, 0.0,0.0, 0.5, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.5, 0.5, 0.0, 1.0 );void main() {//gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition + pushConsts.objPos, 1.0);//fragPos =vec3( ubo.model * vec4(inPosition+ pushConsts.objPos, 1.0));gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0);fragPos =vec3( ubo.model * vec4(inPosition, 1.0));fragColor = inColor;fragNormal = mat3(transpose(inverse(ubo.model))) *inNormal;fragTexCoord = inTexCoord;fragBaseLight = ubo.baseLight;ambientStrength= ubo.ambientStrength;lightPos=ubo.lightPos;specularStrength=ubo.specularStrength;viewPos=ubo.viewPos;m_ambient = inM_ambient;m_diffuse = inM_diffuse;m_specular = inM_specular;m_shininess = inM_shininess;lightDirect= ubo.lightDirect;flashPos= ubo.flashPos;flashDir= ubo.flashDir;flashCutOff= ubo.flashCutOff;outerCutOff= ubo.outerCutOff;flashColor= ubo.flashColor;outShadowCoord =  ( biasMat * ubo.lightSpace * ubo.model ) * vec4(inPosition, 1.0);
}

可以看出,我们在顶点着色器中仅添加了outShadowCoord二维纹理,之后再片元着色器中使用这一参数:

 #version 450
#extension GL_ARB_separate_shader_objects : enablelayout(binding = 1) uniform sampler2D texSampler;
layout(binding = 2) uniform sampler2D shadowMap;layout(location = 0) in vec3 fragColor;
layout(location = 1) in vec3 fragNormal;
layout(location = 2) in vec2 fragTexCoord;
layout(location = 3) in vec3 fragBaseLight;
layout(location = 4) in float ambientStrength;
layout(location = 5) in vec3 lightPos;
layout(location = 6) in vec3 fragPos;
layout(location = 7) in float specularStrength;
layout(location = 8) in vec3 viewPos;
//Material
layout(location = 9) in vec3 m_ambient;
layout(location = 10) in vec3 m_diffuse;
layout(location = 11) in vec3 m_specular;
layout(location = 12) in float m_shininess;
layout(location = 13) in vec3 lightDirect;
layout(location = 14) in vec3 flashPos;
layout(location = 15) in vec3 flashDir;
layout(location = 16) in float flashCutOff;
layout(location = 17) in float outerCutOff;
layout(location = 18) in vec3 flashColor;
layout(location = 19) in vec4 inShadowCoord;layout(location = 0) out vec4  FragColor;vec3 lightAmbient  = vec3( 0.1f, 0.1f, 0.1f);
vec3 lightDiffuse  = vec3( 0.5f, 0.5f, 0.5f);
vec3 lightSpecular = vec3( 0.8f, 0.8f, 0.8f);
float constant = 1.0f;
float linear =  0.09f;
float quadratic = 0.032f;
float distance = length(lightPos - fragPos);
float attenuation = 1.0 / (constant + linear * distance +  quadratic * (distance * distance));float textureProj(vec4 P, vec2 off)
{float shadow = 1.0;vec4 shadowCoord = P / P.w;if ( shadowCoord.z > -1.0 && shadowCoord.z < 1.0 ) {float dist = texture( shadowMap, shadowCoord.st + off ).r;if(shadowCoord.w > 0.0){shadow = 2;}if ( shadowCoord.w > 0.0 && dist < shadowCoord.z ) {shadow = 0.3;}}return shadow;
}void main() {vec3 norm = normalize(fragNormal);vec3 lightDir = normalize(-lightDirect);// 漫反射着色float diff =  max(dot(norm, lightDir), 0.0);// 镜面光着色vec3 reflectDir = reflect(-lightDir, norm);float spec = pow(max(dot(normalize(viewPos - fragPos), reflectDir), 0.0), m_shininess);// 合并结果vec3 ambient  = lightAmbient  * vec3(texture(texSampler, fragTexCoord));vec3 diffuse  = lightDiffuse  * diff * vec3(texture(texSampler, fragTexCoord));vec3 specular = lightSpecular * spec * vec3(texture(texSampler, fragTexCoord));// 计算阴影float shadow = textureProj(inShadowCoord / inShadowCoord.w, vec2(0.0));vec3 color = (ambient +  shadow * (diffuse + specular)) * fragBaseLight;FragColor = vec4(color * shadow, 1.0);}

通过textureProj函数,我们可以计算出shadow的值,并在片元着色器最后返回的时候将其作用在颜色输出中,运行代码,你将会看到:

再如您可以在更新uniformBuffer的时候动态调整光源位置,实现24h日照效果等等,以及更多关于阴影精细化设置,您如果感兴趣的话可以自行实现。

Vulkan_Shader—高级光照_阴影_实现相关推荐

  1. Vulkan_Shader—高级光照_阴影_原理

    高级光照_阴影原理概述 阴影是光线被阻挡的结果:当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候,那么这个物体就在阴影中了.阴影能够使场景看起来真实得多,并且可以让观察者获得物体之间的 ...

  2. 【笔记】Cocos2d-x高级开发教程:制作自己的捕鱼达人 笔记一:序_前言_第一章

    [笔记]Cocos2d-x高级开发教程:制作自己的<捕鱼达人> 笔记一:序_前言_第一章 转载请注明出处:http://blog.csdn.net/l_badluck/article/de ...

  3. 复习Collection_迭代器使用细节_泛型_综合案例

    Collection_迭代器使用细节_泛型_综合案例 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 集合:集合是java中提供的一种 ...

  4. Day06_动态组件_插槽_自定义指令_tabbar案例

    Day06_动态组件_插槽_自定义指令_tabbar案例 文章目录 Day06_动态组件_插槽_自定义指令_tabbar案例 知识点自测 今日学习目标 1. 组件进阶 1.0 组件进阶 - 动态组件 ...

  5. 索引_期刊_影响因子_分区

    索引_期刊_影响因子_分区 主要介绍的是索引及期刊.影响因子.分区在文章末尾附有网址,可以参考网址中内容. 国际 SCI.EI.ISTP是世界三大重要检索系统,其收录文章的状况是评价国家.单位和科研人 ...

  6. 企业信使运营管理平台官网_注册_开自助充值

    企业信使运营管理平台-企业信使帮助您扩大产品知名度,提高企业经营业绩,提升管理水平,实现与客户指定号码进行短信批量发送和自定义发送的电信.移动.联通公司三网集中的网页操作发送平台,让广大的公司.网店主 ...

  7. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  8. learnOGL 结合代码看一些光照模型以及高级光照

    learnOGL 一些光照模型以及高级光照 1 phon的光照和blinn-phon的光照 直接看这个shader: #version 330 core out vec4 FragColor;in V ...

  9. MATLAB_4-形态学_腐蚀_膨胀_灰度图的腐蚀以及膨胀_开运算_闭运算_文章末尾有几个素材例子

    素材链接: MATLAB_4-形态学_课程需要的素材 记住单词拼写: 腐蚀 erode 膨胀 dilate 开运算 open 闭运算 close 图像重建 imreconstruct reconstr ...

最新文章

  1. Spring Boot 教程(三): Spring Boot 整合Mybatis
  2. python基础30个常用代码大全-Python基础小题汇总
  3. 【论文解读】CVPR 2021 当之无愧的最佳论文奖:GIRAFFE,一种可控图像合成方法...
  4. 【Apache POI】Java Web根据模板导出word文件
  5. 征名公布|Qtum量子链企业版—Unita 中文名征集圆满落幕
  6. 精读《setState 做了什么》
  7. View#post与Handler#post的区别,以及导致的内存泄漏分析
  8. java.sql.ResultSet
  9. Qt控件背景图片自适应
  10. c/c++ utf-8与gbk的互相转化
  11. 清理 Chrome DNS Cache
  12. CTF题记——取证小集合
  13. php 12306查询结果,使用php怎么编写一个12306余票查询功能
  14. 5G丨美国运营商Verizon年底在美国20座城市开通5G服务
  15. 模板文件如何调用php函数,模板文件调用方法与路径
  16. 什么是mybatis,全是干货
  17. 免费的B站短链生成器,将链接转成b23.tv
  18. 锚定情境法:有效控制变量自评偏差
  19. 英语人机考试计算机算分吗,过来人跟你说说英语人机对话考试的经验
  20. 20155305乔磊2016-2017-2《Java程序设计》第十周学习总结

热门文章

  1. 计算机应用基础多媒体技术,计算机应用基础多媒体技术论文
  2. 恶意程序smss.exe查杀(zz)
  3. 知识付费:在线教育课程如何做推广
  4. vapor mysql_无法在Vapor项目中连接我的MySQL数据库
  5. Python自学笔记9:实操案例六(千年虫,购物流程)
  6. Python版 IMEI 验证
  7. 大学相关比赛(常规和计算机类赛事)
  8. html谷歌浏览器自动播放视频,谷歌浏览器怎么才能绕过视频自动播放的限制呢?大家有没有什么好办法...
  9. oracle 启动mrp进程,dataguard中MRP无法启动的问题分析和解决
  10. 拼多多商品详情接口测试及申请