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

菲利普·沃西尔(Filip Wasil)

我的阴影有问题,我在代码中看不到任何错误。在视频上都可以看到。

https://www.youtube.com/watch?v=dZXEPLIYGNM&feature=youtu.be

我的光源在没有纹理的球内,并且正在移动。阴影被替换

基本上:

  • 在阴影阶段,我使用与渲染阶段相同的程序
  • 我的阴影纹理与视口大小相同(1920 x 1200)
  • 我的光源是点光源
  • 我只使用片段和顶点着色器(不使用几何和镶嵌)
  • 只有一个光源
  • 我的深度MVP矩阵是LightProjection * LightCamera * MeshModelMatrix
  • 我的投影是:视场90近平面0.1远平面5000000.0
  • 视口比例1
  • 摄像头(0.0,1.0,0.0)
  • 我以正确的方式使用偏差矩阵
  • 图形nVidia nvm3100m驱动程序版本。304.117-我已经显示了其他视口,以便从灯光的角度观看场景

我所有的代码都在抽象的后面,所以我从中选择了所有可能影响阴影的东西(我认为)。点光源效果很好,但是阴影放置在错误的地方。

https://www.youtube.com/watch?v=dZXEPLIYGNM&feature=youtu.be

我的片段着色器:

#version 330

struct Light {
    vec4 position;
    vec4 intensity;
    mat4 mvp;
};

...
out vec4 fColor;
in vec4 vVertexWorldSpace;
...
uniform texture2D uShadowTexUnit;
...
uniform Light uLight;
...
vec4 ambient = vec4(0.1,0.1,0.1,0.0);
...
float calculateShadow(vec4 lightPosition, sampler2D shadowMap) {
    vec3 shadowMapUV = lightPosition.xyz / lightPosition.w;
    float shadowMapDepth = texture(shadowMap, shadowMapUV.xy).x;

    if ((shadowMapDepth < shadowMapUV.z - 0.00001))                                                                 
        return 0.1;                                                                         
    else                                                                                    
        return 1.0;     
}


void main() {
   ...
   lightDepth = uLight.mvp * vVertexWorldSpace;
   shadow = calculateShadow(lightDepth, uShadowMaps);
   ...
   fColor = vec4(shadow * colorDiffuse.xyz,1.0) + colorAmbient;
}

我的顶点着色器:

#version 330
...
layout(location = 0) in vec4 aPosition;
...
out vec4 vVertexWorldSpace;

uniform mat4 uModelMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uProjectionMatrix;

void main() {
   vec4 vertexWorldspace = uModelMatrix * aPosition;
   vVertexWorldSpace = vertexWorldSpace;

   gl_Position = uProjectionMatrix * uViewMatrix * vertexWorldspace;
}

我在Light类构造函数中的相机设置:

   Light::Light(glm::vec3 position,
                glm::vec4 intensity):mIntensity(intensity),
                                     mShadowTextureUnit(31){
   mShadowCamera = new Camera(glm::vec3(position), //position
                              glm::vec3(0.0,0.0,0.0), // lookAt point - always 0
                              glm::vec3(0.0,1.0,0.0), //head
                              glm::radians(90.0), //field of view angle
                              1.0, // viewport ratio
                              0.1, // near plane
                              2000.0); //far plane
   }

我在网格中的渲染代码:

class Mesh {

     ...

     glm::mat4 modelMatrix;
     glm::mat4 cameraMatrix;
     glm::mat4 projectionMatrix;

     ...

     void Mesh::render () {

        glActiveTexture(GL_TEXTURE0 + fillwave_texture_unit);
        mTextureRegion->getTexture()->bind();
        mProgram->uniformPush("uDiffuseTextureUnit", fillwave_texture_unit);

        glm::mat4 eye = mLight->getShadowCamera()->getEye();
        glm::mat4 projection = mLight->getShadowCamera()->getProjection();
        glm::vec4 lightTranslation = mLight->getShadowCamera()->getTranslation();
        glm::vec4 lightIntensity = mLight->getIntensity()();

        //MVP model
        shader->uniformPush ("uModelMatrix", modelMatrix);
        shader->uniformPush ("uCameraMatrix", cameraMatrix);
        shader->uniformPush ("uProjectionMatrix", projectionMatrix);

        //MVP light
        shader->uniformPush ("uLight.position", lightTranslation);
        shader->uniformPush ("uLight.intensity", lightIntensity);
        shader->uniformPush ("uShadowTexUnit", mLight->getTextureUnit());

        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
        );

        shader->uniformPush ("uLight.mvp",biasMatrix *
                                           projection * // projection
                                           eye * // camera matrix
                                           m); // model matrix of this mesh
     }
}
菲利普·沃西尔(Filip Wasil)

我终于开始工作了。窗口的分辨率设置为1920X1200,纹理大小也等于1920x1200。我的屏幕为1440x900,因此我正在将1440x900的屏幕渲染为1920x1200的纹理。这就是阴影被移动的原因。纹理被部分填充。

左下方-相机视图,右下方-距相机视图的深度

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL中的阴影贴图

来自分类Dev

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

来自分类Dev

OpenGL Variance阴影贴图倒置衰减

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

阴影贴图的位置和分辨率

来自分类Dev

阴影贴图工件

来自分类Dev

阴影贴图-将视图空间位置转换为阴影贴图空间

来自分类Dev

阴影贴图-将视图空间位置转换为阴影贴图空间

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

SSAO 和阴影贴图 | 阴影不适用于 SSAO

来自分类Dev

阴影贴图和深度值混淆

来自分类Dev

级联阴影贴图不太正确

来自分类Dev

具有延迟渲染的阴影贴图

来自分类Dev

巴比伦JS中的阴影贴图

来自分类Dev

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

来自分类Dev

阴影贴图和深度值混淆

来自分类Dev

如何使用phong阴影实现凹凸贴图

来自分类Dev

聚光灯阴影贴图的计算偏差

来自分类Dev

阴影贴图:整个网格都在阴影中,根据深度贴图应该没有光线的地方

来自分类Dev

带有更改顶点位置的ShaderMaterial的three.js中的阴影贴图问题

来自分类Dev

c的模板阴影错误

来自分类Dev

OpenGL简单阴影,伪影

来自分类Dev

如何使OpenGL支持颜色阴影?

来自分类Dev

OpenGL简单阴影,伪影

Related 相关文章

热门标签

归档