c++ - 将深度缓冲区渲染为纹理的管道可能存在什么问题?

标签 c++ opengl depth zbuffer depth-testing

我理解的深度测试的主要步骤: 1)启用深度测试以及我们希望如何进行深度测试 2) 创建帧缓冲对象并确保它有附加的深度 3) 绑定(bind)我们的帧缓冲区对象(确保在渲染前清除它) 4) 画东西

应该是吧?我们的帧缓冲区深度附件应该有深度数据?但我总是得到直1的默认深度清晰颜色

第一步:

glEnable(GL_DEPTH_TEST);
glDepthFunc( GL_LEQUAL );

第 2 步:

//create the frame buffer object
glGenFramebuffers(1, &m_uifboHandle);

// Initialize FBO
glBindFramebuffer(GL_FRAMEBUFFER, m_uifboHandle);

//create 2 texture handles 1 for diffuse, 1 for depth
unsigned int m_uiTextureHandle[2];
glGenTextures( 2, m_uiTextureHandle );

//create the diffuse texture
glBindTexture( GL_TEXTURE_2D, m_uiTextureHandle[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiWidth, uiHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_uiTextureHandle[0], 0); 

.

//create the depth buffer
glBindTexture(GL_TEXTURE_2D, m_uiTextureHandle[1]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, uiWidth, uiHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_uiTextureHandle[1], 0);

//go back to default binding
glBindFramebuffer(GL_FRAMEBUFFER, 0);

第 3 步:

//bind the frame buffer object
glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle );

//clear it
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

第 4 步:

//draw things

这不是步骤吗?
我错过了什么吗?
我尝试了几个不同的教程。
我无法获得任何深度来渲染纹理 我一遍又一遍地得到 1。

最佳答案

帧缓冲区可能不完整。尝试 checking for completeness .此外,您的代码是:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiWidth, uiHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

然而,它应该是(看RGB-RGBA):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, uiWidth, uiHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

关于c++ - 将深度缓冲区渲染为纹理的管道可能存在什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612461/

相关文章:

c++ - 从 C++ 中的模板类继承

OpenGL,如何像平常深度缓冲区一样使用帧缓冲区中的深度缓冲区

linux - glUseProgram() GL_INVALID_OPERATION 1282 在 Ubuntu Gnome 17.04 Intel HD4000 上

c - libpng,c代码,如何将RGB值转换为像素值?

c++ - FreeImage+OpenCV - 16 位图像失真

c++ - C++中的运算符重载

c++ - opengl 中鼠标输入背后的数学和偏航/俯仰值

c++ - 带有 C++ 程序的 MacOS 10.6 上的 gprof 有调用数据但没有计时数据 --- 为什么?

c++ - 远程机器上的 OpenGL (v >=3) 应用程序

python - 叶子处的二叉树深度