OpenGL阴影贴图几乎可以正常工作

亚历克·蒂勒纽斯

我正在尝试按照教程将实时阴影映射添加到我的Minecraft类克隆中:此处

首先会发生什么:

在此处输入图片说明 在此处输入图片说明

据我所知,阴影贴图是否正确渲染?问题似乎出在最后一遍。

我创建深度纹理:

glGenFramebuffers(1, &m_frameBufferId);
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferId);
glGenTextures(1, &m_depthTexture);
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT16, 1024, 1024, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_depthTexture, 0);
glDrawBuffer(GL_NONE);

注意:我还尝试将GL_COMPARE_R_TO_TEXTURE与着色器中的sampler2DShadow结合使用。结果一样。

然后运行两遍:

// ====================    Shadow    =====================
glBindFramebuffer(GL_FRAMEBUFFER, m_frameBufferId);
glViewport(0, 0, 1024, 1024);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

ShadowShader->Bind();
VCSceneGraph::Instance->RenderGraph();


// ====================    Final    =======================
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, 1280, 800);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

VoxelShader->Bind();
VCSceneGraph::Instance->RenderGraph();

阴影着色器代码:

// ====================    Vert    =====================
#version 330 core\n

in vec4 vertexPosition_modelspace;
uniform mat4 depthMVP;

void main()
{
    gl_Position =  depthMVP * vertexPosition_modelspace;
}

// ====================    Frag    =====================
#version 330 core\n

out float fragmentdepth;

void main()
{
    fragmentdepth = gl_FragCoord.z;
}

最终通过(Voxel Shader)代码:

// ====================    Vert    =====================
#version 330 core\n

in vec3 position;
in int normal;
in vec4 color;

out vec4 colorVarying;
out vec4 ShadowCoord;

uniform mat4 modelViewProjectionMatrix;
uniform mat4 DepthBiasMVP;

void main()
{
    gl_Position =  modelViewProjectionMatrix * vec4(position, 1);
    ShadowCoord = DepthBiasMVP * vec4(position, 1);
    colorVarying = color;
}

// ====================    Frag    =====================
#version 330 core\n

in vec4 colorVarying;
in vec4 ShadowCoord;

out vec4 color;

uniform sampler2D  shadowMap;

void main()
{
    float visibility = 1.0;

    if ( texture(shadowMap, ShadowCoord.xy).z  <  ShadowCoord.z)
    {
        visibility = 0.5;
    }

    color.xyz = colorVarying.xyz * visibility;
    color.w = colorVarying.w;
}

我怀疑我的问题出在更新最终通行证制服的代码中:

// Re-create the exact same MVP matrix that was used for the shadow pass
glm::mat4 depthProjectionMatrix = glm::ortho<float>( -30, 30, -30, 30, -100, 100);
glm::mat4 depthViewMatrix = glm::lookAt(glm::vec3(0.5f, 2, 2), glm::vec3(0,0,0), glm::vec3(0,1,0));
depthViewMatrix = glm::translate(depthViewMatrix, -15.0f, 30.0f, 0.0f);
glm::mat4 depthMVP = depthProjectionMatrix * depthViewMatrix;// * modelMatrix;

// Multiply it be the bias matrix
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 * depthMVP;

// Create Camera's MVP
VCCamera* currentCamera = VCSceneGraph::Instance->CurrentRenderingCamera;
glm::mat4 ProjectionMatrix = currentCamera->ProjectionMatrix;
glm::mat4 ViewMatrix = currentCamera->ViewMatrix;
glm::mat4 MVP = ProjectionMatrix * ViewMatrix;// * modelMatrix;

// Update uniforms
glUniformMatrix4fv(m_unifMVP, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix4fv(m_unifDepthMVP, 1, GL_FALSE, &depthBiasMVP[0][0]);

编辑:

我通过使“阴影”纹理与窗口具有相同的分辨率来解决此问题。但是,我无法解释为什么可以解决此问题。如果有人想破解,我会接受您的回答。预期的输出是这样的:在此处输入图片说明

我还应该指出,完整的源代码可以在GitHub上找到

西弗勒斯

我比较了您和我的阴影,建议您使用sampler2DShadow而不是sampler2D该采样器仅用于阴影,并且有一些用于阴影投影的功能(shadow2DProj等)。您可以像这样使用它。

in vec4 colorVarying;
varying vec4 ShadowCoord;

out vec4 color;

uniform sampler2DShadow shadowMap;

float offset_lookup(sampler2DShadow map, vec4 loc, vec2 offset) {
    //Texture size (1024 x 1024)
    vec2 texmapscale = vec2(1.0/1024.0, 1.0/1024.0);
    //Set bias as you need (it corrects shadow acne)
    float bias = 0.001;
    vec4 result = shadow2DProj(map, vec4(loc.xy + offset * texmapscale * loc.w, loc.z, loc.w));
    if (loc.z > result.z + bias) {
        return 0.5;
    } else {
        return 1.0;
    }
}

void main() {
    float shadowFactor;
    shadowFactor = offset_lookup(shadowMap, ShadowCoord, vec2(0, 0));
    color = colorVarying * shadowFactor;
}

什么是最后一个参数偏移量?您可以使一些阴影模糊。3x3阴影模糊:

//3x3 blur
    for (y = -1.5; y <= 1.5; y += 1.0)
        for (x = -1.5; x <= 1.5; x += 1.0)
            sum += offset_lookup(shadowMap, ShadowCoord, vec2(x, y));
    //I am no sure why 16 (insted of 9) but I use this and it works :D
    float shadeFactor = sum / 16.0;

尝试一下,也许结果将完全符合您的期望。

PS:对不起,我的英语。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

级联阴影贴图无法正常工作

来自分类Dev

使用OpenGL纹理贴图无法正常工作

来自分类Dev

OpenGL中的阴影贴图

来自分类Dev

AngularJs自动完成几乎可以正常工作

来自分类Dev

蛋糕.htaccess重写几乎可以正常工作

来自分类Dev

AngularJS分页几乎可以正常工作

来自分类Dev

AngularJs自动完成几乎可以正常工作

来自分类Dev

OpenGL延迟阴影照明无法正常工作

来自分类Dev

OpenGL阴影贴图-阴影位置错误

来自分类Dev

OpenGL Variance阴影贴图倒置衰减

来自分类Dev

与CakePHP深度关联的表格,几乎可以正常工作

来自分类Dev

迅速-游戏倒数计时器几乎可以正常工作

来自分类Dev

Lua Ide Cocos。表几乎可以正常工作,然后无法正常工作

来自分类Dev

OpenGL阴影贴图移动版不起作用

来自分类Dev

OpenGL阴影贴图在所有对象上均相同

来自分类Dev

使用带有延迟渲染 Opengl 3.3 的阴影贴图的问题

来自分类Dev

为什么阴影贴图着色器向后工作?

来自分类Dev

neovim使用VIMINIT在ssh上移动配置(几乎可以正常工作)

来自分类Dev

正则表达式需要帮助:模式几乎可以正常工作

来自分类Dev

当用户单击按钮时显示指令的内容-几乎可以正常工作

来自分类Dev

阴影贴图OpenGL阴影并不总是绘制,并且绘制光源位置的位置

来自分类Dev

阴影贴图工件

来自分类Dev

如何在OpenGL中使用立方体贴图数组使用阴影贴图渲染多个点光源?

来自分类Dev

ios7:自定义推送segue iOS7之前的样式几乎可以正常工作

来自分类Dev

GLSL 中阴影光线的平滑阴影无法正常工作

来自分类Dev

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

来自分类Dev

OpenGL Shader无法正常工作

来自分类Dev

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

来自分类Dev

UIPageViewController-检测滚动到下一个视图控制器(几乎可以正常工作)中途以更改按钮颜色吗?

Related 相关文章

  1. 1

    级联阴影贴图无法正常工作

  2. 2

    使用OpenGL纹理贴图无法正常工作

  3. 3

    OpenGL中的阴影贴图

  4. 4

    AngularJs自动完成几乎可以正常工作

  5. 5

    蛋糕.htaccess重写几乎可以正常工作

  6. 6

    AngularJS分页几乎可以正常工作

  7. 7

    AngularJs自动完成几乎可以正常工作

  8. 8

    OpenGL延迟阴影照明无法正常工作

  9. 9

    OpenGL阴影贴图-阴影位置错误

  10. 10

    OpenGL Variance阴影贴图倒置衰减

  11. 11

    与CakePHP深度关联的表格,几乎可以正常工作

  12. 12

    迅速-游戏倒数计时器几乎可以正常工作

  13. 13

    Lua Ide Cocos。表几乎可以正常工作,然后无法正常工作

  14. 14

    OpenGL阴影贴图移动版不起作用

  15. 15

    OpenGL阴影贴图在所有对象上均相同

  16. 16

    使用带有延迟渲染 Opengl 3.3 的阴影贴图的问题

  17. 17

    为什么阴影贴图着色器向后工作?

  18. 18

    neovim使用VIMINIT在ssh上移动配置(几乎可以正常工作)

  19. 19

    正则表达式需要帮助:模式几乎可以正常工作

  20. 20

    当用户单击按钮时显示指令的内容-几乎可以正常工作

  21. 21

    阴影贴图OpenGL阴影并不总是绘制,并且绘制光源位置的位置

  22. 22

    阴影贴图工件

  23. 23

    如何在OpenGL中使用立方体贴图数组使用阴影贴图渲染多个点光源?

  24. 24

    ios7:自定义推送segue iOS7之前的样式几乎可以正常工作

  25. 25

    GLSL 中阴影光线的平滑阴影无法正常工作

  26. 26

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

  27. 27

    OpenGL Shader无法正常工作

  28. 28

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

  29. 29

    UIPageViewController-检测滚动到下一个视图控制器(几乎可以正常工作)中途以更改按钮颜色吗?

热门标签

归档