Opengl 延迟阴影映射GLSL

Opengl 延迟阴影映射GLSL,opengl,mapping,glsl,shadow,deferred,Opengl,Mapping,Glsl,Shadow,Deferred,我目前正在实现一个延迟渲染管道,我一直使用阴影映射。 我已经成功地将它应用到了一条前进的管道中 我采取的步骤是: 在灯光视图中获得位置 转换为灯光视图剪辑空间 获得*0.5+0.5的阴影纹理坐标 检查深度 编辑:使用新结果图像更新代码: float checkShadow(vec3 position) { // get position in light view mat4 invView = inverse(cameraView); vec4 pEyeDir = sunBias * sunP

我目前正在实现一个延迟渲染管道,我一直使用阴影映射。 我已经成功地将它应用到了一条前进的管道中

我采取的步骤是:

  • 在灯光视图中获得位置
  • 转换为灯光视图剪辑空间
  • 获得*0.5+0.5的阴影纹理坐标
  • 检查深度
  • 编辑:使用新结果图像更新代码:

    float checkShadow(vec3 position) {
    // get position in light view
    mat4 invView = inverse(cameraView);
    vec4 pEyeDir =  sunBias * sunProjection  * sunView * invView  * vec4(position, 1.0);
    
    // light view clip space
    pEyeDir = pEyeDir / pEyeDir.w;
    
    // get uv coordinates
    vec2 sTexCoords = pEyeDir.xy * 0.5 + 0.5;
    
    float bias = 0.0001;
    float depth = texture(sunDepthTex, sTexCoords).r - bias;
    float shadow = 1.0f;
    
    if(pEyeDir.z * 0.5 + 0.5 > depth)
    {
        shadow = 0.3f;
    }
    
    return shadow;
    
    }

    以下是一些对上述代码很重要的变量:

    vec3 position = texture(positionTex, uv).rgb;
    
    另外,我在一些相机位置得到了一个暗背景(网格保持不变),只有当我将阴影值乘以最终颜色时才会发生

    根据要求,以下是位置和太阳深度纹理:


    好的,我修好了。问题是因为灯光深度与gbuffer纹理的大小不同

    要使用不同的纹理大小,我必须使用

    coords = (coords / imageSize ) * windowSize;
    

    好的,我修好了。问题是因为灯光深度与gbuffer纹理的大小不同

    要使用不同的纹理大小,我必须使用

    coords = (coords / imageSize ) * windowSize;
    

    要显示的一些图像??什么是同步性…-)乍一看,用眼向量计算shadowTexCoord很奇怪。它应该用
    translate(0.5,0.5)*scale(0.5,0.5)*lightProj*lightView*vertexos
    -(modeltransforms*vertexos)计算。您看到的图像是不使用眼向量的结果。我只使用了位置纹理中的位置。是否需要对象模型矩阵?这不是gbuffer位置纹理的作用吗?
    vec4 ModWorldPos=inverse(gl_ModelViewMatrix)*gl_顶点-inverse(modelView)*gl_顶点;ShadowCoord=gl_TextureMatrix[7]*(gl_顶点-ModWorldPos)这是我的,纹理矩阵是
    translate(0.5,0.5)*scale(0.5,0.5)*lightProj*lightView
    你确定要使用延迟渲染吗?我不知道应该如何将每个模型矩阵传递给延迟传递,因为这只是一个着色的四元组。您可以使用不推荐使用的glsl函数,如glTextureMatrix。我使用4.2核心。一些图片来显示??什么是同步性…-)乍一看,用眼向量计算shadowTexCoord很奇怪。它应该用
    translate(0.5,0.5)*scale(0.5,0.5)*lightProj*lightView*vertexos
    -(modeltransforms*vertexos)计算。您看到的图像是不使用眼向量的结果。我只使用了位置纹理中的位置。是否需要对象模型矩阵?这不是gbuffer位置纹理的作用吗?
    vec4 ModWorldPos=inverse(gl_ModelViewMatrix)*gl_顶点-inverse(modelView)*gl_顶点;ShadowCoord=gl_TextureMatrix[7]*(gl_顶点-ModWorldPos)这是我的,纹理矩阵是
    translate(0.5,0.5)*scale(0.5,0.5)*lightProj*lightView
    你确定要使用延迟渲染吗?我不知道应该如何将每个模型矩阵传递给延迟传递,因为这只是一个着色的四元组。您可以使用不推荐使用的glsl函数,如glTextureMatrix。我使用4.2内核。