Hello all,
I’m trying to implement omni directional shadows using cube map textures. I’m pretty sure I have everything set up alright, but it’s not coming out the way I expected.
I create the depth cube maps like this:
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
GLfloat borderColor[] = { 1.0, 1.0, 1.0, 1.0 };
cubeMapBuffer.genTexture();
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapBuffer.getID());
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexParameterfv(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BORDER_COLOR, borderColor);
for(int i = 0; i < 6; i++){
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
0, GL_DEPTH_COMPONENT16, shadowMapW, shadowMapH, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
}
//This is an array of GLuints
glGenFramebuffers(6, shadowFrameBufferIDs);
glGenRenderbuffers(6, renderBufferIDs);
for(int i = 0; i < 6; i++){
glBindFramebuffer(GL_FRAMEBUFFER, shadowFrameBufferIDs[i]);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
cubeMapBuffer.getID(), 0);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferIDs[i]);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, shadowMapW, shadowMapH);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderBufferIDs[i]);
switch(glCheckFramebufferStatus(GL_FRAMEBUFFER)){
case GL_FRAMEBUFFER_UNDEFINED:
std::cout << "Framebuffer undefined
";
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
std::cout << "Framebuffer incomplete attachment
";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
std::cout << "Framebuffer missing attachment image
";
break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS:
std::cout << "Framebuffer incomplete layer targets
";
break;
case GL_FRAMEBUFFER_COMPLETE:
//std::cout << "Framebuffer complete
";
break;
}
}
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
/*
*/
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK);
Which seems to not throw any errors. I don’t check every case, but I check the ones I felt were applicable to the problem.
And then I update the ShadowCube every frame:
GLint viewPort[4];
glGetIntegerv(GL_VIEWPORT, viewPort);
glViewport(0, 0, shadowMapW, shadowMapH);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapBuffer.getID());
for(int i = 0; i < 6; i++){
glBindFramebuffer(GL_FRAMEBUFFER, shadowFrameBufferIDs[i]);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
viewProjectionMatrix = glm::perspective <float>(glm::radians(90.0f), shadowMapW / shadowMapH, 1.0f, 500.0f) * glm::lookAt(myCenterPos, myCenterPos + CameraDirections[i].Target, CameraDirections[i].Up);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubeMapBuffer.getID(), 0);
switch(glGetError()){
case GL_NO_ERROR:
std::cout << "No Framebuffer error
";
break;
case GL_INVALID_OPERATION:
std::cout << "Framebuffer invalid operation
";
break;
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//Grab current view before adjusting
glUseProgram(depthProgID.getID());
GLuint vpLoc = glGetUniformLocation(depthProgID.getID(), "depthVP");
glUniformMatrix4fv(vpLoc, 1, GL_FALSE, glm::value_ptr(viewProjectionMatrix));
glUseProgram(skelDepthProgID.getID());
vpLoc = glGetUniformLocation(skelDepthProgID.getID(), "VP");
glUniformMatrix4fv(vpLoc, 1, GL_FALSE, glm::value_ptr(viewProjectionMatrix));
DrawAllEntDepth();
}
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(viewPort[0], viewPort[1], viewPort[2], viewPort[3]);
Which seems to be fine. I ran it through API trace and it shows nothing in the way of cube map textures, for whatever reason (hence why I needed help).
And then I upload it to the shader as a samplerCube.
The fragment shader then samples it based on the direction between the light and the frag. But I think it returns error, because I return it as the shadow and it makes the entire set of pixels go black, basically breaking the whole renderer. So I’m not sure what went wrong, but I would appreciate help!
Thanks,
Devmane144