OpenGL 问题:我只能在尝试绘制深度纹理时变白

问题描述 投票:0回答:1

我试图在正方形上绘制深度纹理,但只有这样的白色 white square with a cottage 此外,我也尝试生成点光影立方体贴图,但它仍然只有白色。

这里是阴影贴图生成代码

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;
}

函数 renderInit() 和 GLSL 代码:

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;
}

我用这个着色器生成阴影贴图

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";

然后我通过下面的着色器显示我的阴影贴图

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";
c++ opengl glsl glm-math
1个回答
0
投票

忘记绑定变换矩阵了,现在就这样了a cottage shadow! 在渲染任何场景之前,请注意每个状态。

© www.soinside.com 2019 - 2024. All rights reserved.