shadow map

【Unity——Screenspace Shadow Map与传统Shadow Map】 根据帧调试器以及书中内容,Screenspace Shadow Map主要的渲染事件以下1.UpdateDepthTexture,更新摄像机的深度纹理2.RenderShadowMap,渲染得到阴影映射纹理ShadowMap3.CollectShadows,根据深度纹理与阴影映射纹理计算得到屏幕空间阴影纹理4.绘制最终渲染结果各个步骤的结果如下。 阅读详情

Shadow mapping 的原理: 

一个物体之所以会处在阴影当中,是由于在它和光源之间存在着遮蔽物,或者说遮蔽物离光源的距离比物体要近,这就是 shadow mapping 算法的基本原理.


Pass1: 以光源为视点,或者说在光源坐标系下面对整个场景进行渲染,目的是要得到一副所有物体相对于光源的 depth map (也就是我们所说的shadow map),也就是这副图像中每个象素的值代表着场景里面离光源最近的 fragment 的深度值。由于这个pass中我们感兴趣的只是象素的深度值,所以可以把所有的光照计算关掉,打开 z-test 和 z-write 的 render state 。

Pass2: 将视点恢复到原来的正常位置,渲染整个场景,对每个象素计算它和光源的距离,然后将这个值和 depth map中相应的值比较,以确定这个象素点是否处在阴影当中。然后根据比较的结果,对 shadowed fragment 和 lighted fragment 分别进行不同的光照计算,这样就可以得到阴影的效果了。 


实现一:固定管线

纹理:

在实现过程中,需要指定纹理坐标,而opengl中有两种为顶点指定坐标的方法:

第一种是人工为每个顶点指定坐标,可以通过函数glTexCord*()来完成

第二种是自动生成纹理坐标,由函数glTexGen*()来完成。

//Set up texture coordinate generation.
	glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
	glTexGenfv(GL_S, GL_EYE_PLANE, textureMatrix.GetRow(0));
	glEnable(GL_TEXTURE_GEN_S);

	glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
	glTexGenfv(GL_T, GL_EYE_PLANE, textureMatrix.GetRow(1));
	glEnable(GL_TEXTURE_GEN_T);

	glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
	glTexGenfv(GL_R, GL_EYE_PLANE, textureMatrix.GetRow(2));
	glEnable(GL_TEXTURE_GEN_R);

	glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
	glTexGenfv(GL_Q, GL_EYE_PLANE, textureMatrix.GetRow(3));
	glEnable(GL_TEXTURE_GEN_Q);




实现二:可编程管线

void display()
{
	//1.render to framebuffer with fixed pipeline
	glBindFramebuffer(GL_FRAMEBUFFER,fboId);

	//Use viewport the same size as the shadow map
	glViewport(0, 0, windowWidth, windowHeight);

	// Clear previous frame values
	glClear(GL_DEPTH_BUFFER_BIT);

	//Disable color rendering, we only want to write to the Z-Buffer
	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 

	// Culling switching, rendering only backface, this is done to avoid self-shadowing
	glCullFace(GL_FRONT); 

	glMatrixMode(GL_PROJECTION);
	glLoadMatrixf(&lightProjectionMatrix[0][0]);

	glMatrixMode(GL_MODELVIEW);
	glLoadMatrixf(&lightViewMatrix[0][0]);

	drawScene();

	glBindFramebuffer(GL_FRAMEBUFFER, 0);


	//2.render to screen with programmable pipeline

	glViewport(0, 0, windowWidth, windowHeight);

	//Enabling color write (previously disabled for light POV z-buffer rendering)
	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

	// Clear the screen
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glCullFace(GL_BACK); // Cull back-facing triangles -> draw only front-facing triangles

	glMatrixMode(GL_PROJECTION);
	glLoadMatrixf(&cameraProjectionMatrix[0][0]);

	glMatrixMode(GL_MODELVIEW);
	glLoadMatrixf(&cameraViewMatrix[0][0]);

	glm::mat4 biasMatrix(
		0.5, 0.0, 0.0, 0.0, 
		0.0, 0.5, 0.0, 0.0,
		0.0, 0.0, 0.5, 0.0,
		0.5, 0.5, 0.5, 1.0
		);

	glm::mat4 depthBiasMVP = biasMatrix*cameraProjectionMatrix*cameraViewMatrix;

	// Use  shader
	glUseProgram(shadowProgramID);
	glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &depthBiasMVP[0][0]);
	
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, shadowMapTexture);
	glUniform1i(shadowMapUniform, 0);
	
	drawScene();


	// DEBUG only. this piece of code draw the depth buffer onscreen
	
	glUseProgram(0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-windowWidth/2,windowWidth/2,-windowHeight/2,windowHeight/2,1,20);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glColor4f(1,1,1,1);
	glActiveTextureARB(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D,shadowMapTexture);
	glEnable(GL_TEXTURE_2D);
	glTranslated(0,0,-1);
	glBegin(GL_QUADS);
	glTexCoord2d(1,1);glVertex3f(-1,-1,0);
	glTexCoord2d(0,1);glVertex3f(-windowWidth/2,-1,0);
	glTexCoord2d(0,0);glVertex3f(-windowWidth/2,-windowHeight/2,0);
	glTexCoord2d(1,0);glVertex3f(-1,-windowHeight/2,0);
	glEnd();
	glDisable(GL_TEXTURE_2D);
	
	glutSwapBuffers();
}

//shadowmap.vert
#version 120

uniform mat4 DepthBiasMVP;

varying vec4 ShadowCoord;

void main()
{
	gl_Position = ftransform();
	
	gl_FrontColor = gl_Color;
	
	ShadowCoord = DepthBiasMVP * gl_Vertex;

}

//shadowmap.frag
#version 120

uniform sampler2D ShadowMap;

varying vec4 ShadowCoord;


void main()
{
	vec4 shadowCoordinateWdivide = ShadowCoord / ShadowCoord.w;
	
	shadowCoordinateWdivide.z += 0.0005;
	
	float distanceFromLight = texture2D(ShadowMap, shadowCoordinateWdivide.st).z;
	
	float shadow = 1.0;
	
	if(ShadowCoord.w > 0.0)
		shadow = distanceFromLight < shadowCoordinateWdivide.z ? 0.5 : 0.99;
		
	
	gl_FragColor = shadow * gl_Color;

}


OpenGLES demo - 14. 阴影贴图 Shadow Map 之平行光 做一个场景,里面摆放着各种物体,那么bu'ke 阅读详情

相关推荐

Shadow Map 和 Shadow Volume

Shadow Map和Shadow Volume 可以说是最常见的阴影计算方法,二者各有千秋。个人认为,理解这两种阴影算法的重要前提是 理解 ZTest,ZWrite,Stencil Test的作用。 ShadowMap适用于静态的光源和静态的物体,好处是开销不算大,需要2个pass。而且对于静态的光源和物体,大多数情况下,生成的Depth Map可以进行复用(此时,为啥不选择光照贴图)

1290

实时阴影技术(Shadow Mapping)

额外设置一个摄像机在光源位置(Light Camera,光源摄像机),并且朝光照方向看去。用一张 Texture(称为 阴影贴图 Shadow Map)来记录 Light Camera所看到的像素深度(每个像素位置只记录所见最近深度,而不用做别的 shading 计算)来作为遮挡深度。1.2 渲染 Pass主摄像机需要渲染屏幕每个像素时,该像素对应的世界坐标进行 Light Camera 的MVP变换后能得到在 Light Camera屏幕空间中的对应位置 shadowCoord(x’,y’,z’)

gghhb12的博客 3890

Cascaded Shadow Map总结

Perspective Aliasing; Cascaded Shadow Map; CSM; Shadow Map

My Notes 3720

Learn OpenGL 笔记6.3 Shadow Mapping(阴影贴图)

阴影为照明场景增添了大量真实感,并使观看者更容易观察对象之间的空间关系。 它们为我们的场景和物体提供了更大的深度感。 在当前的实时(光栅化图形)研究中,还没有开发出完美的阴影算法。 有几种很好的阴影近似技术,但它们都有我们必须考虑的缺点。 基础知识: 1.shadow mapping阴影映射 大多数游戏使用的一种技术可以提供不错的结果并且相对容易实现,那就是shadow mapping阴影映射。 shadow mapping不太难理解,不会在性能上花费太多,并且很容易扩展到更高级的算法(如Omn

u013617851的博客 2330

基于Shadow Map的阴影实现

0、简介 Shadow Mapping是一种基于图像空间的阴影实现方法,其优点是实现简单,适应于大型动态场景;缺点是由于shadow map的分辨率有限,使得阴影边缘容易出现锯齿(Aliasing);关于SM的研究很活跃,主要围绕着阴影抗锯齿,出现了很多SM变种,如PSM,LPSM,VSM等等,在这里http://en.wikipedia.org/wiki/Shadow_mapping可以找到很

nxtgo 7528

OpenGLES demo - 15. 阴影贴图 Shadow Map 之点光源

这章只是上一章的扩展。上章讲了怎么实现一个平行光的yin'ying

hoytGM的专栏 3351

Shadow Mapping与光线追踪,软阴影和硬阴影,进行光线追踪(Ray Tracing),光线投射(Ray Casting),AABB包围盒,Oct-Tree 八叉树,KD-Tree,BVH加速

Shadow Mapping与光线追踪,软阴影和硬阴影,进行光线追踪(Ray Tracing),光线投射(Ray Casting),AABB包围盒,Oct-Tree 八叉树,KD-Tree,BVH加速

qq_43157227的博客 2099

ShadowMapping(阴影映射)

在安卓下面实现openGL的Shadow Mapping,运用到GLSL 有很好的参考作用 代码博客: http://blog.youkuaiyun.com/xiaoge132/article/details/51458489

阴影(shadow mapping)(硬阴影)

得到的这个图我们不要做着色,把这些点对应的位置的深度记下来。相当于我只需要它的深度图。找到对应的点投影回光源,在光源中的深度图上应当出现在哪个位置上。在深度图上对于这个点记录有一个深度,同样可以计算从摄像机看这个点,这个点到光源的深度,这两个深度肯定是一致的,那说明这个点一定是可以被光源所看到的。如果相机所记录的点的深度投影到光源,与光源所记录的深度不一致,则说明该点被遮挡,即眼睛看不到。

dx1313113的博客 839

shadow Mapping 阴影投影

shadow Mapping 阴影投影 主要介绍阴影投影实现的原理 和 实现方法

Cube shadow mapping

一个实现 cube shadow mapping 功能的源代码. 通过这个例程, 能加深大家对 cube environment mapping 和 shadow mapping 的理解和运用.

图形学笔记(十一)光线追踪——Shadow Mapping、光线追踪、光线投射、软硬阴影、光线与物体交点、AABB包围盒

文章目录1 Shadow Mapping与光线追踪1.1 Shadow Mapping1.1.1 概览1.1.2 Shadow Mapping步骤1> 从光源渲染2> 从摄像机渲染1.1.3 Shadow Mapping结果1.1.4Shadow Mapping的问题1.2 软阴影和硬阴影1.2.1 概览1.2.2 软阴影的原理1.3 进行光线追踪(Ray Tracing)的原因 1 Shadow Mapping与光线追踪 1.1 Shadow Mapping 1.1.1 概览 Shadow M

weixin_43399489的博客 4516

毕业设计基于cesium的可视-前端

简介 毕业设计作品,边学边做的,可以供初学者cesium学习使用。 效果 http://chenkai.gz01.bdysite.com/CesiumExample/ 或 https://chenkai0520.github.io/CesiumExample/

Convolution&Exponential shadow map

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=52FCE20899526C5E8C5A3EA5D70E4681?doi=10.1.1.146.177&rep=rep1&type=pdfhttp://research.edm.uhasselt.be/~tmertens/slides/csm.ppt这哥们是作者之一,非常喜欢这哥们,主页在此, 很多不错的文章http://developer.download.nvidia.com/present

安柏霖的专栏 6756

高光高亮 模型边缘 HighlightingSystem

高光高亮 模型发光..........边缘发光................

安卓应用锁开发实战:如何通过拦截Activity启动实现密码验证(附完整代码)

本文深入探讨了在安卓系统中开发应用锁功能的两种实战方案:通过修改ActivityStarter源码或实现IActivityController接口来拦截Activity启动流程,从而实现启动前的密码验证。文章详细对比了两种方案的技术选型、实现细节与适用场景,并提供了处理隐式Intent、验证状态管理等核心问题的完整代码,为开发系统级安全功能提供了实用指南。

tcp8optimizer的博客 461

Shadow Map 原理和改进

shadow map基础及基本改进方法

ronintao的专栏 4万+

用Python和NumPy搞定复合材料层合板ABD矩阵计算(附完整代码与避坑指南)

本文详细介绍了如何使用Python和NumPy高效计算复合材料层合板的ABD刚度矩阵,包括单层板刚度计算、偏轴转换和层合板刚度集成。通过完整的代码示例和工程实践技巧,帮助工程师快速构建定制化分析工具,解决航空航天、汽车制造等领域的复合材料力学性能分析问题。特别提供了避坑指南和性能优化策略,确保计算结果的准确性和效率。

weixin_30752699的博客 279

Shadow Map阴影贴图技术之探 【转】

这两天勉勉强强把一个shadowmap的demo做出来了。参考资料多,苦头可不少。Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势。本篇是第一辑。——ZwqXin.comShadow Map的原理很简单,但是实现起来到处是雷。当然这只是我的体会。恩,不过就是“从光源处看场景,那些看不见的区域全部都该是阴影”。很容易看出,与针...

weixin_33762321的博客 186

定时器(PWM输出)触发ADC采样(DMA)——STM32CubeMX

已知 Tclk 为 84MHz , 我们需要 Tout 为 200ms 即 200000us , 不妨先让PSC为 839, 带入上述公式可得 ARR = 19999. 这样算出来之后ARR和PSC都在0~65535的范围, 则可以使用这组参数。例如,如果时钟频率为1MHz,并且PSC设置为1000,则实际的定时频率将为1kHz。当重装载值(Period 或 ARR)设置为 500 时,意味着定时器需要计数 500 个时钟周期才会触发中断。例如,如果时钟频率为1MHz,则Tclk为1微秒。

2301_77123899的博客 1万+

手把手教你用运放搭建方波三角波发生器(附Multisim仿真文件)

本文详细解析了使用运算放大器搭建方波和三角波发生器的核心原理与设计步骤。通过剖析迟滞比较器与积分器的联动机制,指导读者进行电路设计、元件选型,并借助Multisim仿真进行参数调优与波形优化。文章提供了从理论分析、虚拟仿真到实物焊接调试的完整实践指南,并附有仿真文件,帮助硬件爱好者与初学者深入掌握这一经典模拟电路设计。

weixin_29165725的博客 642

Shadow Map阴影贴图技术之探

这两天勉勉强强把一个shadowmap的demo做出来了。参考资料多,苦头可不少。Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势。本篇是第一辑。——ZwqXin.comShadow Map的原理很简单,但是实现起

痞子龙3D编程 1万+

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3203
上一篇: opengl shader 使用札记
下一篇: Hello Mahout
traceorigin
博客等级 码龄15年 38粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值