Articles of shadow mapping

OpenGL的阴影贴图总是黑色的四边形

我尝试使用带定向光的阴影贴图在C ++上运行Android OpenGL ES3,我有一个用于生成深度贴图的着色器程序,以及用phong材质渲染场景的着色器,它具有高光和法线贴图以及骨骼animation着色器),我使用下面的例程,但结果是暗四方总是在附加的图像: 1-添加阳光并创建深度缓冲区: if (sun->castShadow) { glGenFramebuffers(1, &depthMapFBO); glGenTextures(1, &depthMap); glBindTexture(GL_TEXTURE_2D, depthMap); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0); glDrawBuffers(0, GL_NONE); glReadBuffer(GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, 0); } 2-使用此函数渲染CastShadow属性设置为true的网格 void Engine::renderDepthMaps() { if (sun != […]

可以使用深度input纹理完成对FBO的绘制,还是需要颜色附件?

我试图实现指数阴影贴图 ,我已经得到它几乎工作。 我卡住的部分是深度图的“可选”可分离的高斯模糊,以给出柔和的阴影。 我正在使用附加到临时深度图的OpenGL Framebuffer对象,并且正在尝试使用具有原始深度图的屏幕四边形(两个三角形)作为input纹理。 然后,我对模糊的第二阶段也做了同样的处理,input和输出相反。 不幸的是,这导致深度缓冲区充满了1.0,这暗示着我没有任何东西在被绘制。 在我发现的这个示例代码中 ,他们使用颜色和深度附件来绘制带有模糊着色器的屏幕四边形。 (不幸的是我能find的唯一的OpenGL例子) 我想知道如果这是必要的,或者他们只附加和模糊颜色缓冲区,因为他们正在存储它们的深度值。 换句话说,我想知道在这种情况下是否实际上只能使用深度缓冲区Framebuffer Object attachment。

阴影贴图:深度贴图始终返回0

我正在使用附加到帧缓冲区的深度纹理为我的体素引擎中的太阳光实施阴影贴图。 但是当我在正常通道中采样深度纹理时,返回值始终为0。 这里是阴影图初始化: // Create and configure the depth texture shadowMapTextureId = GL11.glGenTextures(); GL11.glBindTexture(GL11.GL_TEXTURE_2D, shadowMapTextureId); GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (FloatBuffer) null); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL13.GL_CLAMP_TO_BORDER); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL13.GL_CLAMP_TO_BORDER); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_MODE, GL30.GL_COMPARE_REF_TO_TEXTURE); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_COMPARE_FUNC, GL11.GL_LEQUAL); GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); // Create the framebuffer and attach the depth texture shadowMapFramebufferId […]

过滤引起的阴影伪影

我正在为OpenGLES 2.0环境(Flash中的Stage3D)进行阴影贴图实现。 这是我目前的实施工作方式: 渲染场景到缓冲区。 从光线的角度渲染深度图。 从相机的角度渲染纹理上的阴影。 (做模糊和其他效果来改善阴影纹理,还没有实现) 通过乘法渲染阴影纹理到后台缓冲区。 一些照片来帮助解释。 请注意,兔子是有意浮在空中的。 从相机的视图渲染纹理上的阴影。 带有阴影纹理的最后一个场景在顶部呈现出多个。 问题是兔子底部没有阴影的像素。 由于阴影纹理是用线性filter渲染的,所以阴影的边缘会失去清晰度。 这主要是一件好事,但不是无处不在。 我想对阴影做更多的过滤效果,但是会导致更大的问题。 在任何教程或论坛中,我都没有遇到过这样的问题,所以要么是有明显的解决scheme,要么是我的方法有问题。 问题是,我可以用我目前的方法解决这个问题吗? 还是我的方法有更大的差距?

只有一个对象被渲染为FBO的阴影贴图

我一直在使用OpenGL中的FBO渲染阴影贴图。 我在引擎中设置了一个简单的方向灯,并设法渲染出阴影贴图。 “我的场景”是一座大城堡,阴影笼罩在场景中的大部分物体上。 出于好奇,我拆除了城堡,只是添加了一个简单的地板,我的阴影地图不再适当地渲染。 看起来,一次只有一个对象正在通过我的渲染通道进入阴影贴图。 以下是渲染结构的概述: void RenderingManager::RenderGL() { PreRenderGL(); ShadowPassGL(); //Other user defined render passes here? ScenePassGL(); //Cleanup directionalLights.clear(); pointLights.clear(); renderables.clear(); } ShadowPassGL()调用相当简单 void RenderingManager::ShadowPassGL() { glViewport(0, 0, 1024, 1024); for (unsigned int i = 0; i < directionalLights.size(); i++) directionalLights[i]->RenderShadowMap(ShadowShader); } RenderShadowMap(Shader* shadowShader)调用有点复杂,但是正确的视图设置正确,查看也是正确的。 我已经validation了由我的math函数生成的matrix工作。 void DirectionalLightInternal::RenderShadowMapGL(Shader* shadowShader) { //Bind shadow shader for rendering […]

Unity 3D免费版中的自定义阴影映射

由于实时硬阴影和柔和阴影是Unity 3D Pro的唯一function,我以为我会学习Cg编程并创建自己的阴影映射着色器。 但经过一番挖掘,我发现阴影贴图技术使用depth textures ,而在Unity中,深度值可以通过Render Texture对象(仅为Unity Pro)进行访问。 那么是不是真的,我不能创建实时阴影着色器作为解决免费版本的限制的解决方法?