零基础学习OpenGL(十三)--阴影(二) 点光源阴影

       上节我们学了如何使用阴影映射技术创建动态阴影,但它只适合定向光,因为阴影只是在单一定向光源下生成的。本节我们的焦点是在各种方向生成动态阴影。这个技术可以适用于点光源,生成所有方向上的阴影。        点光阴影,过去的名字是万向阴影贴图(omnidirectional shadow maps)技术。算法和定向阴影映射差不多:我们从光的透视图生成一个深度贴图,基于当前fragme...
摘要由CSDN通过智能技术生成

       上节我们学了如何使用阴影映射技术创建动态阴影,但它只适合定向光,因为阴影只是在单一定向光源下生成的。本节我们的焦点是在各种方向生成动态阴影。这个技术可以适用于点光源,生成所有方向上的阴影。

        点光阴影,过去的名字是万向阴影贴图(omnidirectional shadow maps)技术。算法和定向阴影映射差不多:我们从光的透视图生成一个深度贴图,基于当前fragment位置来对深度贴图采样,然后用储存的深度值和每个fragment进行对比,看看它是否在阴影中。定向阴影映射和万向阴影映射的主要不同在于深度贴图的使用上。

       对于深度贴图,定向光只要用2D的贴图就可以,但是点光源,需要从这个点的所有渲染场景,普通2D深度贴图不能工作,但是用立方体贴图可以储存6个面的环境数据,它可以将整个场景渲染到立方体贴图的每个面上,把它们当作点光源四周的深度值来采样。生成后的深度立方体贴图被传递到光照像素着色器,它会用一个方向向量来采样立方体贴图,从而得到当前的fragment的深度(从光的透视图)。

       为创建一个光周围的深度值的立方体贴图,我们必须渲染场景6次:每次一个面。显然渲染场景6次需要6个不同的视图矩阵,每次把一个不同的立方体贴图面附加到帧缓冲对象上。

for(int i = 0; i < 6; i++)

{

    GLuint face = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i;

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, face, depthCubemap, 0);

    BindViewMatrix(lightViewMatrices[i]);

    RenderScene();

}

       这会很耗费性能因为一个深度贴图下需要进行很多渲染调用。这个教程中我们将转而使用另外的一个小技巧来做这件事,几何着色器允许我们使用一次渲染过程来建立深度立方体贴图。

创建一个立方体贴图:

    GLuint depthCubemap;

    glGenTextures(1, &depthCubemap);

生成立方体贴图的每个面,将它们作为2D深度值纹理图像:

    const GLuint SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;

    glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap);

    for (GLuint i = 0; i < 6; ++i)

        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值