OpenGL - 无法读取/写入 2D 深度纹理数组

OpenGL - Can't read/write to 2D depth texture arrays

本文关键字:2D 深度 纹理 数组 写入 读取 OpenGL      更新时间:2023-10-16

我需要使用2D纹理数组级联阴影映射,我不认为我正确使用它们,然而。以下是我为测试目的编写的摘录:

int err = glGetError();
unsigned int frameBuffer;
glGenFramebuffers(1,&frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);
unsigned int texture;
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D_ARRAY,texture);
int size = 2;
int splits = 3;
glTexImage3D(
    GL_TEXTURE_2D_ARRAY,0,
    GL_DEPTH_COMPONENT24,
    size,size,splits,0,
    GL_DEPTH_COMPONENT,GL_FLOAT,
    NULL
);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D_ARRAY,GL_TEXTURE_COMPARE_FUNC,GL_LEQUAL);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glFramebufferTextureLayer(
    GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,
    texture,0,0 // Use layer 0 for subsequent operations
);
glClearColor(0.5f,0.5f,0.5f,0.5f);
glClear(GL_DEPTH_BUFFER_BIT);
float *px = new float[size *size];
glReadPixels(0,0,size,size,GL_DEPTH_COMPONENT,GL_FLOAT,&px[0]);
err = glGetError();
std::cout<<"Error: "<<err<<std::endl;
for(unsigned int i=0;i<(size *size);i++)
    std::cout<<px[i]<<std::endl;
delete[] px;

这应该创建一个2D深度纹理数组,并简单地填充它的第一层,每个像素0.5。

没有opengl错误报告,但是我的输出是所有像素都是1。这是怎么回事?

由于您在渲染目标中只有一个深度缓冲区,因此此序列中的glClearColor()调用将没有效果:

glClearColor(0.5f,0.5f,0.5f,0.5f);
glClear(GL_DEPTH_BUFFER_BIT);

深度的默认值是1.0,你永远不会改变它。如果你想将深度清除为0.5,你需要这样做:

glClearDepth(0.5f);
glClear(GL_DEPTH_BUFFER_BIT);