第一轮绘制正常:

第二轮绘制时着色器变量C全为黑色

static void SetupShadowBuffers(GLFWwindow* window) {
GLuint buffer_id[1]{};
glGenBuffers(1, buffer_id);
glfwGetFramebufferSize(window, &WIDTH, &HEIGHT);
glGenFramebuffers(1, buffer_id);
shadow_buffer = buffer_id[0];
glBindFramebuffer(GL_FRAMEBUFFER, shadow_buffer);
glGenTextures(1, buffer_id);
shadow_texture = buffer_id[0];
glBindTexture(GL_TEXTURE_2D, shadow_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, shadow_texture, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glGenTextures(1, buffer_id);
shadow_depth = buffer_id[0];
glBindTexture(GL_TEXTURE_2D, shadow_depth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, WIDTH, HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadow_depth, 0);
}
循环代码
/*第一轮:绘制阴影,记录颜色*/
glBindFramebuffer(GL_FRAMEBUFFER, shadow_buffer);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDepthFunc(GL_LEQUAL);
glUseProgram(shadow_program);
camera.vloc = glGetUniformLocation(shadow_program, "vmat");
camera.ploc = glGetUniformLocation(shadow_program, "pmat");
camera.mvloc = glGetUniformLocation(shadow_program, "proj");
DrawShadow(&camera, &vm, cone, proj_mat * glm::translate(glm::mat4(1.0f), cone->position));
DrawShadow(&camera, &vm, surface, proj_mat * glm::translate(glm::mat4(1.0f), surface->position));
DrawShadow(&camera, &vm, cube, proj_mat * glm::translate(glm::mat4(1.0f), cube->position));
DrawShadow(&camera, &vm, tetrahedron, proj_mat * glm::translate(glm::mat4(1.0f), tetrahedron->position));
DrawShadow(&camera, &vm, icosahedron, proj_mat * glm::translate(glm::mat4(1.0f), icosahedron->position));
DrawShadow(&camera, &vm, sphere, proj_mat * glm::translate(glm::mat4(1.0f), sphere->position));
DrawShadow(&camera, &vm, water_droplet, proj_mat * glm::translate(glm::mat4(1.0f), water_droplet->position));
DrawModelShadow(&camera, &vm, penguin, proj_mat * glm::translate(glm::mat4(1.0f), penguin->position) * glm::scale(glm::mat4(1.0f), glm::vec3(1.0f, 1.0f, -1.0f)));
/*第二轮:绘制除阴影外的物体*/
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
glDepthFunc(GL_LEQUAL);
glUseProgram(plain_program);
InstallLight(plain_program);
camera.mvloc = glGetUniformLocation(plain_program, "mvmat");
camera.ploc = glGetUniformLocation(plain_program, "pmat");
camera.vloc = glGetUniformLocation(plain_program, "vmat");
camera.cloc = glGetUniformLocation(plain_program, "texture_color");
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, shadow_texture);
DrawObject(&camera, &vm, square, glm::translate(glm::mat4(1.0f), square->position) * glm::scale(glm::mat4(1.0f), glm::vec3(64.0f, 64.0f, 64.0f)));
片段着色器代码
#version 430
layout (binding=0) uniform sampler2D sampler;
in vec3 varying_normal;
in vec3 varying_direction;
in vec3 varying_vertpos;
in vec4 glp;
out vec4 color;
uniform mat4 mvmat;
uniform mat4 pmat;
uniform mat4 vmat;
uniform vec4 texture_color;
uniform vec4 GlobalAmbient;
uniform vec4 DirLightAmbient;
uniform vec4 DirLightDiffuse;
uniform vec4 DirLightSpecular;
uniform vec3 DirLightDirection;
void main(void) {
vec3 L = normalize(varying_direction);
vec3 N = normalize(varying_normal);
vec3 V = normalize(varying_vertpos);
vec3 H = normalize(L + V);
vec4 C = texture(sampler, (vec2(glp.x, glp.y)) / (2.0 * glp.w) + vec2(0.5, 0.5));
//C[0] = float(C[0] <= 0.999);
//C[1] = float(C[1] <= 0.999);
//C[2] = float(C[2] <= 0.999);
float cos_theta = dot(L, N);
float cos_phi = dot(N, H);
float flag = float(texture_color[3] <= 0.001);
vec3 ambient = GlobalAmbient.xyz * texture_color.xyz + DirLightAmbient.xyz * texture_color.xyz;
vec3 diffuse = C.xyz * texture_color.xyz * DirLightDiffuse.xyz * (max(cos_theta, 0.0) * (flag * 0.6 + 0.4));
vec3 specular = C.xyz * DirLightSpecular.xyz * pow(max(cos_phi, 0.001), 3.0 * texture_color[3]) * (1.0 - flag) * 0.6;
//color = vec4(ambient + diffuse + specular, 1.0);
color = C;
}