I tried to draw a depth texture on a square but there is only white like this white square with a cottage besides, I also tried to generate a point light shadow cubemap, but it is still only white.
here is the shadow map generation code
unsigned int genParaShadowTex(unsigned int width, unsigned int height, glm::vec3 viewPos, glm::vec3 lightDir, std::vector<const char*> shaderCodeQpsd, std::vector<model*> models) {
unsigned int textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, 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);
unsigned int shadowFBO;
glGenFramebuffers(1, &shadowFBO);
glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureID, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Framebuffer not complete!" << std::endl;
glm::mat4 shadowProj = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, 0.1f, 30.0f);
glm::mat4 shadowTransform = shadowProj * glm::lookAt(viewPos, glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
unsigned int shaderProgram = renderInit(shaderCodeQpsd);
glUseProgram(shaderProgram);
glViewport(0, 0, width, height);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glClear(GL_DEPTH_BUFFER_BIT);
for (int i = 0; i < models.size(); ++i) models[i]->draw();
glDeleteProgram(shaderProgram);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return textureID;
}
the function renderInit() and GLSL code:
unsigned int renderInit(std::vector<const char*> shaderCodeQ){
unsigned int shaderProgram;
unsigned int vertexShader, fragmentShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &shaderCodeQ[0], NULL);
glCompileShader(vertexShader);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &shaderCodeQ[1], NULL);
glCompileShader(fragmentShader);
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
if (shaderCodeQ.size() > 2) {
unsigned int geometryShader;
geometryShader = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometryShader, 1, &shaderCodeQ[2], NULL);
glCompileShader(geometryShader);
glAttachShader(shaderProgram, geometryShader);
}
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
return shaderProgram;
}
I generate shadow map by this shader
const char* pshadowVertexShader = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"uniform mat4 transform;\n"
"void main()\n"
"{\n"
" gl_Position = transform * vec4(aPos, 1.0f);\n"
"}\0";
const char* pshadowFragShader = "#version 330 core\n"
"void main()\n"
"{\n"
"}\0";
then I show my shadow map by the shader below
float testwall[] = {
-1.0f, 1.0f, 5.0f,
-1.0f, -1.0f, 5.0f,
1.0f, -1.0f, 5.0f,
1.0f, -1.0f, 5.0f,
1.0f, 1.0f, 5.0f,
-1.0f, 1.0f, 5.0f
};// I draw the shadow map on this square
const char* pVertexShadowTest = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"out vec2 TexCoord;\n"
"uniform mat4 transform;\n"
"void main()\n"
"{\n"
" gl_Position = transform * vec4(aPos.x, aPos.y, aPos.z, 1.0f);\n"
" TexCoord = vec2(aPos.x/2+0.5, aPos.y/2+0.5);\n"
"}\0";
const char* pFragShadowTest = "#version 330 core\n"
"out vec4 FragColor;\n"
"in vec2 TexCoord;\n"
"uniform sampler2D ourTexture;\n"
"void main()\n"
"{\n"
" FragColor = vec4(vec3(texture(ourTexture, TexCoord).r),1.0f);\n"
"}\n\0";
I forget to bind the transform matrix, now it works like that a cottage shadow! be careful about the every state before you are going to render any scene.