当前位置: 首页 > 知识库问答 >
问题:

GLSL阴影乘法不起作用

沈健
2023-03-14

我遇到了一个非常奇怪的问题,它似乎起源于片段着色器中的一个简单乘法

我正在尝试使用帧缓冲区计算阴影,该帧缓冲区仅从“灯光透视图”渲染深度,这是初学者的常见技术,易于实现

片段着色器:

#version 330 core

uniform sampler2D   parquet;
uniform samplerCube depthMaps[15];

in vec2 TexCoords;

out vec4 color;
in vec3 Normal;  
in vec3 FragPos;  

uniform vec3  lightPos[15]; 
uniform vec3  lightColor[15];
uniform float intensity[15];

uniform float far_plane;
uniform vec3 viewPos;


float ShadowCalculation(vec3 fragPos, vec3 lightPost, samplerCube depthMaps)
{
    vec3 fragToLight = fragPos - lightPost; 
    float closestDepth = texture(depthMaps, fragToLight).r;
    // original depth value
    closestDepth *= far_plane;
    float currentDepth = length(fragToLight);
    float bias = 0.05; 
    float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;

    return shadow;
}


void main()
{
    vec3 norm = normalize(Normal);

    vec3 lightDir = normalize(lightPos[0] - FragPos);
    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * lightColor[0];

    float _distance = length(vec3(FragPos - lightPos[0]));
    float attenuation =  1.0 / pow(_distance +1, 2);
    if(attenuation > 1.0)  attenuation = 1.0;

    float intens = intensity[0];
    if(intensity[0] > 150) intens = 150.0f;

    vec3 resulta = (diffuse * attenuation) * intens;

    //texture color
    vec3 tCol = vec3(texture(parquet, TexCoords));
    //gamma correction
    tCol.rgb = pow(tCol.rgb, vec3(0.45));

    vec3 colors = resulta * tCol * (1.0f - ShadowCalculation(FragPos, lightPos[0],  depthMaps[0]));  

    color = vec4(colors, 1.0f);
}

main()中的最后一个乘法运算表现得很奇怪,将漫反射光的结果乘以纹理颜色可以很好地渲染(因此我们没有阴影,只有漫反射闪电)

//works
vec3 colors = resulta * tCol;

将漫反射光乘以阴影结果也可以很好地渲染(现在我们没有纹理)

//works
vec3 colors = resulta * (1.0f - ShadowCalculation(FragPos, lightPos[0],  depthMaps[0]));  

将所有这些结合起来,只渲染一个黑屏。我在片段着色器中尝试了各种方法,但都没有成功。

最后,这里是用于渲染立方体贴图的片段着色器:

#version 330 core
in vec4 FragPos;
uniform vec3 lightPos;
uniform float far_plane;

void main()
{
    float lightDistance = length(FragPos.xyz - lightPos);
    // map to [0;1] range by dividing by far_plane
    lightDistance = lightDistance / far_plane;
    gl_FragDepth = lightDistance;
} 

你能发现任何逻辑错误吗?我正在使用制服阵列缓冲区,因为我稍后需要同时使用多个灯

共有1个答案

容寒
2023-03-14

经过一段时间尝试可视化调试着色器的输出,我终于找到了错误,我错误地绑定了深度图的立方体贴图纹理,这导致了我在最后一次乘法中看到的奇怪行为

经验教训:这并不总是fragment的错

 类似资料:
  • 问题内容: 我正在尝试用 Robolectric 创建一个测试。我的目标是能够根据自定义行为替换一个类的功能(例如,来自库,并且我无法修改代码)。 我创建了这个小测试来模拟我想做的事情: 在示例中, OriginalMessenger 是库中的类,并提供默认功能。而 ShadowMessenger 是包含我想申请每当我使用自定义行为类 OriginalMessenger 。 但是,当我运行测试时,

  • 我有一个由2个网格(平面、立方体)、一个灯和一个相机组成的场景。我想使用GLSL着色器和OpenGL的阴影映射技术在我的场景中显示阴影。 以下是我得到的结果(为了简单起见,我的立方体和平面都是蓝色和蓝色): 这是FBO和深度纹理初始化: 以下是我的顶点着色器的内容: 还有我的片段着色器: 正如你所见,模型上有一些工件,我不知道如何取出它们。但是阴影看起来是正确的,所以我的着色器中输入的变量也应该是

  • 我已经实现了基本的阴影映射算法,但它只适用于一种灯光。 我想用以下两个点光源渲染场景: 灯1-位置:vec3(-8.0f,5.0f,8.0f),方向:vec3(1.3f,-1.0f,-1.0f) 灯2-位置:vec3(8.0华氏度,5.0华氏度,8.0华氏度),方向:vec3(1.3华氏度,-1.0华氏度,-1.0华氏度) 如果我分别渲染两个灯,我有以下结果: Light_1渲染: 使用灯光_2渲

  • 我正在尝试编写一个简单的着色器,可以添加附加到FBO的纹理。FBO初始化等方面没有问题(我已经测试过了)。问题在于我相信glActiveTexture(GL_TEXTURE0)的应用。它似乎什么都没做——这是我的frag着色器(但通常称为着色器)——我已经通过将gl_FragColor=vec4(0,1,0,1)放进去进行了测试; 在C代码中,我有: 结果:黑屏(显示第二个纹理并使用着色器时(不使

  • 阴影 Unity 的灯光可以将 阴影 从一个游戏对象投射到自身的其他部分或是附近的其他游戏对象上。阴影以『扁平』的方式体现游戏对象的尺寸和位置,因此可以为场景添加一定程度的深度和真实感。 场景视图中的游戏对象正在投射阴影 阴影如何工作? 考虑一种最简单的情况,在场景中只有单个光源。光线从光源出发并沿着直线传播,最终可能会碰撞到场景中的游戏对象。一旦光线碰撞到某个游戏对象,光线将无法继续传播和照亮前

  • 我有一个基本的OpenGL应用程序,我想使用我的投影矩阵。 这是我的矩阵: (WorldCoordinates是Matrix4结构,它只包含一个名为m的变量,即浮点[4][4])(宽度和高度是两个s)。然后,我使用以下方法将此坐标应用于我的<code>顶点 (Shader是一个类,并且有一个绑定()方法,它只是glUseProgram)。 这是我的顶点着色器GLSL 使用这个,它不起作用。但将gl