我有一个由2个网格(平面、立方体)、一个灯和一个相机组成的场景。我想使用GLSL着色器和OpenGL的阴影映射技术在我的场景中显示阴影。
以下是我得到的结果(为了简单起见,我的立方体和平面都是蓝色和蓝色):
这是FBO和深度纹理初始化:
GLfloat border[] = {1.0f, 1.0f, 1.0f, 1.0f};
glGenTextures(1, &this->m_TextId);
glBindTexture(GL_TEXTURE_2D, this->m_TextId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24,
this->m_Width, this->m_Height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, this->m_TextId, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
GLenum result = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if( result == GL_FRAMEBUFFER_COMPLETE) {
printf("Framebuffer is complete.\n");
} else {
printf("Framebuffer is not complete.\n");
}
以下是我的顶点着色器的内容:
#version 400
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;
layout (location = 2) in vec2 VertexTexture;
uniform mat4 MVP;
uniform mat4 ShadowMatrix;
out vec4 ShadowCoords;
void main(void)
{
ShadowCoords = ShadowMatrix * vec4(VertexPosition, 1.0f);
gl_Position = MVP * vec4(VertexPosition, 1.0f);
}
还有我的片段着色器:
#version 400
in vec3 Position;
in vec3 Normal;
in vec2 TexCoords;
in vec4 ShadowCoords;
layout (location = 0) out vec4 FragColor;
uniform sampler2DShadow ShadowMap;
void main(void)
{
vec4 ModelColor = vec4(0.0f, 0.0f, 1.0f, 1.0f);
float shadow = textureProj(ShadowMap, ShadowCoords);
FragColor = ModelColor * shadow;
}
正如你所见,模型上有一些工件,我不知道如何取出它们。但是阴影看起来是正确的,所以我的着色器中输入的变量也应该是正确的(我想是的)。
我在片段着色器中尝试了其他技术,如下所示:
#version 400
in vec3 Position;
in vec3 Normal;
in vec2 TexCoords;
in vec4 ShadowCoords;
layout (location = 0) out vec4 FragColor;
uniform sampler2D ShadowMap;
void main(void)
{
vec4 ModelColor = vec4(0.0f, 0.0f, 1.0f, 1.0f);
vec4 shadowCoordinateWdivide = ShadowCoords / ShadowCoords.w;
shadowCoordinateWdivide.z += 0.0005;
float distanceFromLight = texture2D(ShadowMap,shadowCoordinateWdivide.st).z;
float shadow = 1.0;
if (ShadowCoords.w > 0.0)
shadow = (distanceFromLight < shadowCoordinateWdivide.z) ? 0.5 : 1.0 ;
FragColor = shadow * ModelColor;
}
您可以注意到我没有使用sampler2DShadow,而是现在使用sampler2D。但是正如您所看到的,没有显示阴影:
有人能帮我吗?
第一幅图像可以用浮点问题来解释。通过阴影矩阵变换顶点时,将获得一个点,该点与灯光的距离几乎等于灯光深度缓冲区中的深度(因为该点位于几何体上)。对于其中一些点,变换将在几何体前面提供一个光空间深度,而对于其他点,深度将在几何体后面提供一个光空间深度。因此,根据某种奇怪的模式,它们中的一半最终会被阻塞。
你要做的是朝着光线稍微扰动你的阴影坐标
“Z坐标,以避免这个问题。
我已经实现了基本的阴影映射算法,但它只适用于一种灯光。 我想用以下两个点光源渲染场景: 灯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渲
Note 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 阴影是光线被阻挡的结果;当一个光源的光线由于其他物体的阻挡不能够达到一个物体的表面的时候,那么这个物体就在阴影中了。阴影能够使场景看起来真实得多,并且可以让观察者获得物体之间的空间位置关系。场景和物体的深度感因此能够得到极大提升,下图展示了有阴影和没有阴影的情况下
我遇到了一个非常奇怪的问题,它似乎起源于片段着色器中的一个简单乘法 我正在尝试使用帧缓冲区计算阴影,该帧缓冲区仅从“灯光透视图”渲染深度,这是初学者的常见技术,易于实现 片段着色器: main()中的最后一个乘法运算表现得很奇怪,将漫反射光的结果乘以纹理颜色可以很好地渲染(因此我们没有阴影,只有漫反射闪电) 将漫反射光乘以阴影结果也可以很好地渲染(现在我们没有纹理) 将所有这些结合起来,只渲染一个
我有一个基本的OpenGL应用程序,我想使用我的投影矩阵。 这是我的矩阵: (WorldCoordinates是Matrix4结构,它只包含一个名为m的变量,即浮点[4][4])(宽度和高度是两个s)。然后,我使用以下方法将此坐标应用于我的<code>顶点 (Shader是一个类,并且有一个绑定()方法,它只是glUseProgram)。 这是我的顶点着色器GLSL 使用这个,它不起作用。但将gl
我正在尝试在片段着色器中实现法线贴图和照明。但我的密码似乎不起作用。我的想法是将ModelMatrix的额外副本传递给片段着色器,以便它可以变换存储在纹理中的法线。但反射光实际上发生在另一侧。 [更新]在得到一些建议后,我在顶点着色器中计算了TBN矩阵,将TBN基变换为世界空间,将光位置和眼位置转换为切线空间。但这一次,这颗行星根本就不发光!只显示环境光。然后我发现这是因为漫反射组件的计算结果为负
在代码的开头,我已经初始化了vbo: 然后我的顶点和颜色数组: 现在我创建并绑定vbo并分配空间: 最后是渲染函数: 这应该画一个三角形,但我什么都看不见。可能glVertexPointer和glColorPointer的参数不正确。我已经阅读了opengl上关于VBO的文档。或者,我遵循了几个教程,比如:https://www.youtube.com/watch?v=KIeExgOcmv0 我的