流程:先创建一个RenderTexture,然后用灯光的视口渲染。

然后切换到正常相机,进行渲染,使用RenderTexture中的深度或者颜色纹理,然后还原当前顶点在灯光中的深度,两者对比,比缓存中的大,则为阴影,两个相等则可以直接光照计算。两者都可以不过有一些区别:

1.使用ColorTexture,Shader中需要使用Sampler2D,在灯光的视图中需要对深度进行编码,即颜色等于深度,当然有一个转换关系。 vec3  color = EncodeDepth(depthj);

2.使用DepthTexture,Shader中使用的是Smapler2DShadow,这里通过texture2DProj,获取到的是一个float的值,即深度值。当然DepthTexture需要做以下设置,特别是GL_Compare_MODE和GL_NEARST

   glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

切换到正常相机渲染的时候需要注意:

     如果你用的是BIAS矩阵,那么从刚才灯光生成的纹理中取值,需要的坐标是 B*P*V*M

     如果用的是Shadow Matrix,那么坐标值为: 坐标: S*P*V*M;

        其中ShadowMatrix的值,如下

0.5   0    0    0.5
0 0.5 0 0.5
0 0 0.5 0.5
0 0 0 1

需要注意的是Shader中的Shadow2D在400版本已经不能使用了,只能用textureProj。

以上来自于自我总结,书中的例子也不是很完善,但是根据理论应该是这样子的,

扩展:基于PCF的阴影或者柔化阴影,还有基于模板的阴影都有待探索。

          ---------------------------------《3D绘图程序设计  使用Direct3D和OpenGL》  (使用了gl_TextureMatrix,用的shader比较早)

          --------------------------------- 《OpenGL Shading Language 3rd Edith》  (提出ShadowMatrix理论,但是例子很糟糕)

          ----------------------------------《OpenGL Shading Language  4th Edith》  (例子不够完善)

OpenGL之ShadowMap的更多相关文章

  1. OpenGL.Tutorial16_ShadowMapping

    1. 2. In Tutorial 15 we learnt how to create lightmaps, which encompasses(包含) static lighting. While ...

  2. OpenGL核心技术之Shadow Mapping改进版

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  3. ShadowMap渲染阴影方法及问题 【转】

    ShadowMap基于的原理:SM算法是一个2-pass绘制算法,第一pass从光源视点绘制场景,生成SM纹理,第2pass从视点视图按常规方法绘制场景 从光源的位置观察场景,这时候我们看不到的地方就 ...

  4. OpenGL超级宝典笔记——深度纹理和阴影 【转】

    目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面). ...

  5. Linux OpenGL 实践篇-11-shadow

    OpenGL 阴影 在三维场景中,为了使场景看起来更加的真实,通常需要为其添加阴影,OpenGL可以使用很多种技术实现阴影,其中有一种非常经典的实现是使用一种叫阴影贴图的实现,在本节中我们将使用阴影贴 ...

  6. Shadowmap简易实现

    之前一直没有自己实现过阴影,只是概念上有所了解,这次通过Demo进行实际编写操作. 总的来说没有什么可以优化的,倒是对于窗户这种可用面片代替的物体似乎能优化到贴图上,之前arm有个象棋屋的demo做过 ...

  7. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  8. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  9. OpenGL超级宝典笔记----渲染管线

    在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...

  10. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

随机推荐

  1. 为什么我们要用Spring Boot

    最近我面试了不少人,其中不乏说对 Spring Boot 非常熟悉的,然后当我问到一些 Spring Boot 核心功能和原理的时候,没人能说得上来,或者说不到点上,可以说一个问题就问趴下了! 这是我 ...

  2. CSS操作——列表属性

    CSS中提供了一些列表属性可以用来: ​ (1).设置不同的列表项标记为有序列表 ​ (2).设置不同的列表项标记为无序列表 ​ (3).设置列表项标记为图像 list-style-type(系统提供 ...

  3. 2024 FIC取证比赛wp(更新中)

    本次竞赛容器挂载密码为: 2024Fic@杭州Powered~by~HL! 2024年4月,卢某报案至警方,声称自己疑似遭受了"杀猪盘"诈骗,大量钱财被骗走.卢某透露,在与某公司交 ...

  4. spiderFlow学习笔记

    1.下载demo demo地址:代码下载,文档地址:文档下载 2.加入selenium插件 文档有些,但我琢磨了好一会(QAQ) ①先去码云下载 spider-flow-selenium ②再把插件丢 ...

  5. CENTOS6.8 修改主机名

    1.临时修改主机名   显示主机名:spark@master:~$ hostnamemaster修改主机名:spark@master:~$ sudo hostname hadoopspark@mast ...

  6. Windows 11提示“无法枚举容器中的对象。”

    *为什么会出现这一错误提示?* 在Windows系统当中,对文件或文件夹的权限进行设置可以有效地保护隐私内容.登录管理员账户可以对权限进行更改,并且有权决定是否将内容共享给多个用户使用.但是在某些情况 ...

  7. 面试必问:MySQL死锁 是什么,如何解决?(史上最全)

    MySQL死锁接触少,但面试又经常被问到怎么办? 最近有小伙伴在面试的时候,被问了MySQL死锁,如何解决? 虽然也回答出来了,但是不够全面体系化, 所以,小北给大家做一下系统化.体系化的梳理,帮助大 ...

  8. LeetCode 297. Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化(C++/Java)

    题目: Serialization is the process of converting a data structure or object into a sequence of bits so ...

  9. Windows 预览体验计划显示空白

    Open PowerShell as Administator.In the elevated PowerShell window, copy and paste the following comm ...

  10. Scrapy框架(十)--增量式爬虫

    增量式爬虫 - 概念:监测网站数据更新的情况,只会爬取网站最新更新出来的数据. - 分析: - 指定一个起始url - 基于CrawlSpider获取其他页码链接 - 基于Rule将其他页码链接进行请 ...