流程:先创建一个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. 从xib初始化的UIView如何继承?

    一.如何从xib自定义一个CustomView 1)首先创建继承自UIView的子类CustomView 2)创建名字为CustomView的View的Interface文件 3)在xib的资源文件中 ...

  2. NOIP模拟68

    T1 玩水 解题思路 我们称一个点合法当且仅当 \(s_{i-1,j}=s_{i,j-1}\) . 于是如果一个合法点在它的左上或者右下也可以相邻有一个合法点就是一个合法的图. 树状数组维护即可 co ...

  3. Qt-ui的简单使用,常用控件(2)

    1  简介 本文主要介绍Qt ui界面的简单使用,介绍一些常用的控件. 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=22 2  常用控件 常用 ...

  4. ETL工具-nifi干货系列 第八讲 处理器PutDatabaseRecord 写数据库(详细)

    1.本节通过一个小例子来讲解下处理器PutDatabaseRecord,该处理器的作用是将数据写入数据库. 如下流程通过处理器GenerateFlowFile 生成数据,然后通过处理器JoltTran ...

  5. vue安装及升级

    先装好note.js 安装过程很简单,一直点下一步就ok了.1.1我们通过打开命令行工具(win+R),输入node -v查看node的版本,若出现相应的版本号说明你安装成功了 1.2.npm包管理器 ...

  6. 记一次 .NET某机械臂上位系统 卡死分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序会偶发性的卡死一段时间,然后又好了,让我帮忙看下怎么回事?窗体类的程序解决起来相对来说比较简单,让朋友用procdump自动抓一个卡死时的du ...

  7. Flink状态(一)

    key状态和算子状态 key状态 key状态总是与key有关,只能被用于keyedStream类型的函数与算子.你可以认为key状态是一种被分区的算子状态,每一个key有一个状态分区.每一个key状态 ...

  8. USB OTG有关协议

    想了解USB OTG的工作原理,需要知道三个协议: ADP:Attach Detection Protocol HNP:Host Negotiation Protocol SRP:Session Re ...

  9. 『vulnhub系列』Hack Me Please-1

    『vulnhub系列』Hack Me Please-1 下载地址: https://www.vulnhub.com/entry/hack-me-please-1,731/ 信息搜集: 使用nmap进行 ...

  10. Python读取YAML配置数据

    python编写的一些脚本需要一些简单配置时可以使用yaml文件进行设置.本文将介绍如何使用pyyaml进行读取配置数据. 首先安装pyyaml pip install pyyaml 简单使用下pyy ...