奇异编程 2026-02-14 19:12 采纳率: 50%
浏览 5
已结题

opengl创建纹理保存屏幕数据

第一轮绘制正常:

img


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

img

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;
}
  • 写回答

3条回答 默认 最新

  • 奇异编程 2026-02-14 20:19
    关注

    把glTextureParameteri改为glTexParameteri就好了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月22日
  • 已采纳回答 2月14日
  • 修改了问题 2月14日
  • 创建了问题 2月14日