首页 > 其他分享 >OpenGL之ShadowMap

OpenGL之ShadowMap

时间:2022-10-10 10:13:52浏览次数:36  
标签:OpenGL glTexParameteri ShadowMap 0.5 TEXTURE 2D GL

流程:先创建一个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,glTexParameteri,ShadowMap,0.5,TEXTURE,2D,GL
From: https://www.cnblogs.com/yang131/p/16774665.html

相关文章

  • OpenGL 学习系列---基本形状的绘制
    在之前的一篇博客中,讲述了​​OpenGL基础绘制流程​​ 及相关的代码,其中关于OpenGL程序编译部分都是可以在其他项目中接着复用的,接下来会讲到如何去绘制其他的基本图元......
  • ​OpenGL 学习系列---坐标系统
    在前面​​绘制基本图形​​中,遇到了很明显的问题,圆形不像圆形,正多边形不像正多边形?就像下面图形一样:不规则的形状好好的正五边形却东倒西歪的,这就是因为我们前面的绘制都是......
  • OpenGL 之 GPUImage 源码分析
    GPUImage是iOS上一个基于OpenGL进行图像处理的开源框架,后来有人借鉴它的想法实现了一个Android版本的GPUImage,本文也主要对Android版本的GPUImage进行分析。概......
  • OpenGL之多线程渲染
    随着Vulkan的引入,我们的图形技术的发展到达了一个新的顶点,但是呢,我们的老干爹OpenGL作为落日余晖,他在一些Vulkan才有的新功能上,也提供了一些支持。现在我们来讨论一下OpenG......
  • [CG从零开始] 4. pyopengl 绘制一个正方形
    在做了1~3的基础工作后,我们的开发环境基本OK了,我们可以开始尝试利用pyopengl来进行绘制了。本文主要有三个部分利用glfw封装窗口类,并打开窗口;封装shader类,进......
  • Opengl ES之FBO
    FBO介绍FBO帧缓冲对象,它的主要作用一般就是用作离屏渲染,例如做Camera相机图像采集进行后期处理时就可能会用到FBO。假如相机出图的是OES纹理,为了方便后期处理,一般先将OES......
  • [CG从零开始] 2. 彻底弄清OpenGL 涉及的工具库
    1.跨平台窗口管理为了将OpenGL渲染的内容在操作系统的窗口中显示出来,我们不可避免的需要调用操作系统的API创建窗口、渲染上下文等等,每个操作系统的API都不一样,为......
  • Opengl ES之EBO
    前面我们介绍了VBO与VAO等缓冲对象,今天我们来介绍一下EBO。对于VBO或VAO可以查看之前的文章:OpenglES之VBO和VAOEBO是个啥EBO(ElementBufferObject,也叫IBO:IndexBuf......
  • Opengl ES之VBO和VAO
    前言本文主要介绍了什么是VBO/VAO,为什么需要使用VBO/VAO以及如何使用VBO和VAO。VBO什么是VBOVBO(vertexBufferObject):顶点缓冲对象。是在显卡存储空间中开辟的一块区......
  • [CG从零开始] 1. 安装 pyopengl
    因为只是为了验证原理和想法,实在不愿意折腾C++去编译、链接找库......,并且为了配合今后一系列关于CG的文章,决定用python的openglwrapper来进行实践,所以第一步就是......