Hello, I figured out a solution to this. I thought I should post it here, because it may be of some use to others.
Since using QOpenGLFrameBufferObject was out of question, I had to create the buffer by myself using gl function calls as follows. // Refer http://learnopengl.com/#!Advanced-Lighting/Shadows/Shadow-Mapping if(m_shadowMapFBO != 0) return; // Create a texture for storing the depth map glGenTextures(1, &m_shadowMapTex); glBindTexture(GL_TEXTURE_2D, m_shadowMapTex); 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_CLAMP_TO_BORDER); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); GLfloat borderColor[] = { 1.0, 1.0, 1.0, 1.0 }; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); // Create a frame-buffer and associate the texture with it. glGenFramebuffers(1, &m_shadowMapFBO); glBindFramebuffer(GL_FRAMEBUFFER, m_shadowMapFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_shadowMapTex, 0); // Let OpenGL know that we are not interested in colors for this buffer glDrawBuffer(GL_NONE); glReadBuffer(GL_NONE); // Cleanup for now. glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); Then I rendered the scene by binding the shadow texture. The fragment shader code had to be updated a bit to determine whether a fragment lies within a shadow or outside of it. const float qt_ZNear=0.1; const float qt_ZFar=1000.0; float linearizeDepth(float depth) { float z = depth * 2.0 - 1.0; // Back to NDC return (2.0 * qt_ZNear * qt_ZFar) / (qt_ZFar + qt_ZNear - z * (qt_ZFar - qt_ZNear)); } float evaluateShadow(in vec4 shadowPos) { vec3 shadowCoords = shadowPos.xyz / shadowPos.w; shadowCoords = shadowCoords * c_half + c_half; if(shadowCoords.z > c_one) return c_one; float closestDepth = linearizeDepth( texture2D(qt_ShadowMap, shadowCoords.xy).r ); float currentDepth = shadowPos.z; float shadow = (currentDepth < closestDepth) ? c_one : c_half; return shadow; } With that done, I was now able to render the bike with shadows. http://i.stack.imgur.com/Rek7c.png The complete code can be downloaded from here. https://goo.gl/Cf1B3i Thanks once again Guiseppe! Best Regards, Prashanth On Mon, 1 Feb 2016 at 23:49 Prashanth Udupa <prashanth.ud...@gmail.com> wrote: > Hi Guiseppe, > > The call "m_shadowFBO->texture();" will not return the depth texture >> that you need for shadow mapping, but the (useless) color texture that >> your QOpenGLFramebufferObject contains. There's currently no accessor >> for the depth texture, nor a way to create a QOGLFBO without a color >> texture. For this kind of usages it would be better if you roll out your >> own FBO class :\ >> > > Ok. Got it. Thanks :-) > > Best Regards, > Prashanth > > >
_______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest