OpenGL - 无法读取/写入 2D 深度纹理数组
OpenGL - Can't read/write to 2D depth texture arrays
我需要使用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);
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- OpenGL在启用深度测试时不会丢弃我的碎片
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- C++尝试深度复制唯一指针时出现内存访问冲突
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- OpenGL如何使用多采样2d纹理将深度缓冲区附加到帧缓冲区
- OpenGL - 无法读取/写入 2D 深度纹理数组
- 使用深度缓冲区对2D精灵进行分层