我对阴影贴图很困惑。这是我所理解的(下面的步骤不起作用:))
如何获取利润(请不要对代码感到困惑,这大致是因为我在Java上写的):
1。使用参数创建空的depthTexture(我的是1024x1024)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)
和
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_NULL)
2。创建FBO并将该纹理附加到
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0)
3. 为照明相机设置新的投影和视图矩阵
我使用与我的主相机相同的另一个coords,因为场景看起来更好(我尝试了,所以没有问题...... 我猜 ..)。
4. 创建新的小着色器以确定FBO的gl_Position并使用花哨的东西修改主着色器(偏置矩阵* lightCamera矩阵*顶点,sampler2Dshadow等)
5. 当然要统一一切并做点什么。
现在 RENDER LOOP
1。当然要统一所有事情并再做一些事情。
2. 绑定FBO,绑定小着色器,glViewport(0, 0, 1024, 1024)
,colorMask为false,清除深度缓冲区,glCullFace(GL_FRONT)
,glBindTexture(GL_TEXTURE_2D, 0)
3。只使用顶点位置渲染所有内容完全没有任何内容
4. 取消绑定FBO,将程序重新绑定到主着色器(那个有花哨的东西),glViewport
,启用colorMask,glCullFace(GL_BACK)
5. 正常渲染场景,甚至没有想到“地狱主要着色器会如何得到sampler2DShadow
因为我们不绑定它,不要使它均匀,甚至不要触摸它“
6。观看无数毛刺,错误和像素狂欢
实际上我试着将depthTexture统一到采样器,但我只有黑屏。即使我不渲染FBO,当我这样做时,我也会得到相同的图片。
有人可以解释一下,我错过了什么?
我觉得shader使用漫反射纹理两次:作为漫反射纹理和作为depthTexture,但我不知道如何赋予它deepTexture。
答案 0 :(得分:4)
这是一个很好的链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
和这里:http://www.paulsprojects.net/tutorials/smt/smt.html(虽然第二个链接使用旧的固定函数opengl)
一般来说:
您可以始终渲染深度贴图(在渲染循环中)或仅在光线变化时渲染。
我不知道你为什么通常两次渲染你的场景......你使用的是Z-prepass,还是什么?试试我认为的基本版本。
带阴影贴图的旧代码:
void RenderShadowMap() {
currDepth->Bind();
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gLightCam.SetProjectionMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gLightCam.SetViewMatrix();
glColorMask(false, false, false, false);
glUseProgram(0); // draw without any shaders... just default depth
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(offFactor, offUnits);
SimpleScene(false); // floor does not cast shadow so do not render it
glDisable(GL_POLYGON_OFFSET_FILL);
glColorMask(true, true, true, true);
}
渲染场景:
// compose shadow matrix:
MATRIX4X4 bias(0.5f, 0.0f, 0.0f, 0.0f,
0.0f, 0.5f, 0.0f, 0.0f,
0.0f, 0.0f, 0.5f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f);
MATRIX4X4 *invCam = gSphericalCam.GetInvViewMatrix();
MATRIX4X4 smMat = (*gLightCam.GetViewProjMatrix()) * (*invCam);
gShaderProgramManager->GetProgram("shadow")->Use();
gShaderProgramManager->GetProgram("shadow")->SetMatrix("shadowMat", &smMat);
gShaderProgramManager->GetProgram("shadow")->SetBool("useShadow", currCam != &gLightCam && useShadow);
gShaderProgramManager->GetProgram("shadow")->SetFloat("shadowMapSize", (float)currDepth->GetWidth());
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
gTextureManager->Bind("default");
glActiveTexture(GL_TEXTURE1);
currDepth->BindDepthAsTexture();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
SimpleScene();