使用OpenGL和GLSL的基本阴影映射工件

用户名

我已经编写了一个有关基本阴影映射技术的简单OpenGL测试应用程序。

除了在封堵器背面上的工件外,我已去除了大部分工件。该背面受到伪影的影响,因为在第一次渲染过程(阴影深度图填充)期间,我启用了正面剔除。因此,我有自遮蔽的Z值伪影。

为了解决这种问题,它在一些教程中说过,光空间中顶点位置的深度需要以非常小的偏移量(例如0.0005f)进行偏移。

这是我的问题的屏幕截图(为了能见度,我增加了盒子的环境光值)。这里没有深度偏移:

在此处输入图片说明

如您所见,它具有很强的自我遮蔽性。

这是我在片段着色器中使用的一段代码:

if (ShadowCoords.w > 0.0f)
{
    vec4 tmp_shadow_coords = ShadowCoords;

    tmp_shadow_coords.z -= 0.0000f; //DEPTH OFFSET DISABLE HERE 
    shadowFactor = textureProj(ShadowMap, tmp_shadow_coords);
}

现在,让我们看看使用等于0.0002f的偏移量会发生什么:

tmp_shadow_coords.z -= 0.0002f;

屏幕截图:

在此处输入图片说明

如您所见,自我阴影减少了。现在让我们尝试使用等于0.0003f的偏移量:

tmp_shadow_coords.z -= 0.0003f;

截图:

在此处输入图片说明

如您所见,自我阴影消失了!但是,如果我朝着遮挡物和阴影之间的极限放大,我们可以看到没有阴影的区域。该工件称为Peter Panning工件。

因此,这是一个奇怪的情况:为避免自阴影伪像,我需要修改光照空间中的顶点深度值。但是,对深度值序列的这种修改会导致Peter Panning伪像!

在此处输入图片说明

如果我增加偏移值,问题就更糟了。

更新

我也尝试添加偏移量。例如:

tmp_shadow_coords.z += 0.0002f;

截屏:

在此处输入图片说明

There's less self-shadowing but no Peter Panning artifact. But unfortunatly it appears some artifacts on the front faces of the cube. There's an overflow of the shadow on the front faces.

If I increase the offset:

tmp_shadow_coords.z += 0.0003f;

Screenshot:

在此处输入图片说明

The self-shadowing artifacts have completely disappeared but the shadow overflow in front faces is worse.

So I wonder if it's possible to have a render without both self-shadowing artifact and no Peter Panning artifact ?

jozxyqk

在此处输入图片说明

This works pretty well. There is a small gap where the casting surface is very close to the receiving surface.

在着色器中正确使用的主要方法是如何应用阴影。仅按阴影/遮挡值缩放添加的直接光线,漫反射和镜面反射项(环境项应单独放置)。一个简单的检查是,阴影中的表面应看起来与禁用了阴影的背向灯光的表面完全相同。阴影不应该只是使事物变暗(即finalColour *= 1.0-shadowScalefinalColour -= shadow),而应该是没有直射光。当涉及多个灯时,这变得非常重要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL ES顶点阵列对象和奇怪的工件

来自分类Dev

OpenGL-GLM和GLSL,它们有何不同?

来自分类Dev

使用glTexBuffer和texelFetch的OpenGL(带有GLSL)

来自分类Dev

使用GLSL,多光源阴影映射无法正常工作

来自分类Dev

使用OpenGL和QT进行纹理映射-C ++

来自分类Dev

使用前向渲染进行阴影映射的基本思想(GLSL 1.2)

来自分类Dev

阴影贴图工件

来自分类Dev

带有阴影映射的OpenGL场景渲染为黑色

来自分类Dev

Opengl / GLSL在数组中使用SSBO

来自分类Dev

DirectX9和HLSL的阴影映射问题

来自分类Dev

对GLSL和OpenGL感到困惑

来自分类Dev

使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

来自分类Dev

使用OpenGL和GLSL的具有简单硬阴影映射技术的小工件

来自分类Dev

使用OpenGL和GLSL,Parralax映射无法正常工作

来自分类Dev

OpenGL细分和GLSL用于细分控制明暗器的说明

来自分类Dev

使用OpenGL和GLSL的模板缓冲和延迟渲染

来自分类Dev

使用OpenGL和GLSL的SSAO算法的奇怪性能行为

来自分类Dev

Android NDK SDL2 OpenGL ES 2阴影映射(定向)-可能吗?

来自分类Dev

在GLSL和OpenGL中使用2D PNG中的3D查找表

来自分类Dev

OpenGL:为什么这些代码无法使用交错的VBO和GLSL绘制任何内容

来自分类Dev

OpenGL和GLSL中的凹凸贴图

来自分类Dev

GLSL 1.20阴影贴图,使阴影变形

来自分类Dev

对使用OpenGL和GLSL的性能的简单好奇

来自分类Dev

使用soubroutine的opengl工件

来自分类Dev

DirectX9和HLSL的阴影映射问题

来自分类Dev

使用glsl的现代OpenGL中的最佳矩阵结构和CPU / GPU通信

来自分类Dev

OpenGL - 几何着色器阴影映射通道执行得非常糟糕

来自分类Dev

JavaScript 映射和过滤基本的对象数组

来自分类Dev

带阴影映射和相机移动的点光源

Related 相关文章

  1. 1

    OpenGL ES顶点阵列对象和奇怪的工件

  2. 2

    OpenGL-GLM和GLSL,它们有何不同?

  3. 3

    使用glTexBuffer和texelFetch的OpenGL(带有GLSL)

  4. 4

    使用GLSL,多光源阴影映射无法正常工作

  5. 5

    使用OpenGL和QT进行纹理映射-C ++

  6. 6

    使用前向渲染进行阴影映射的基本思想(GLSL 1.2)

  7. 7

    阴影贴图工件

  8. 8

    带有阴影映射的OpenGL场景渲染为黑色

  9. 9

    Opengl / GLSL在数组中使用SSBO

  10. 10

    DirectX9和HLSL的阴影映射问题

  11. 11

    对GLSL和OpenGL感到困惑

  12. 12

    使用立方体贴图(OpenGL / GLSL),点光源是否可能产生柔和阴影?

  13. 13

    使用OpenGL和GLSL的具有简单硬阴影映射技术的小工件

  14. 14

    使用OpenGL和GLSL,Parralax映射无法正常工作

  15. 15

    OpenGL细分和GLSL用于细分控制明暗器的说明

  16. 16

    使用OpenGL和GLSL的模板缓冲和延迟渲染

  17. 17

    使用OpenGL和GLSL的SSAO算法的奇怪性能行为

  18. 18

    Android NDK SDL2 OpenGL ES 2阴影映射(定向)-可能吗?

  19. 19

    在GLSL和OpenGL中使用2D PNG中的3D查找表

  20. 20

    OpenGL:为什么这些代码无法使用交错的VBO和GLSL绘制任何内容

  21. 21

    OpenGL和GLSL中的凹凸贴图

  22. 22

    GLSL 1.20阴影贴图,使阴影变形

  23. 23

    对使用OpenGL和GLSL的性能的简单好奇

  24. 24

    使用soubroutine的opengl工件

  25. 25

    DirectX9和HLSL的阴影映射问题

  26. 26

    使用glsl的现代OpenGL中的最佳矩阵结构和CPU / GPU通信

  27. 27

    OpenGL - 几何着色器阴影映射通道执行得非常糟糕

  28. 28

    JavaScript 映射和过滤基本的对象数组

  29. 29

    带阴影映射和相机移动的点光源

热门标签

归档