我遇到了一个非常奇怪的问题,它似乎起源于片段着色器中的一个简单乘法
我正在尝试使用帧缓冲区计算阴影,该帧缓冲区仅从“灯光透视图”渲染深度,这是初学者的常见技术,易于实现
片段着色器:
#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;
}
你能发现任何逻辑错误吗?我正在使用制服阵列缓冲区,因为我稍后需要同时使用多个灯
经过一段时间尝试可视化调试着色器的输出,我终于找到了错误,我错误地绑定了深度图的立方体贴图纹理,这导致了我在最后一次乘法中看到的奇怪行为
经验教训:这并不总是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