opengl - FBO 和纹理
问题描述
我已将两个纹理附加到 FBO。第一个纹理将用于显示深度图。第二个纹理将以正常方式显示对象。
如果我这样做,它会很好地工作并向我显示深度图。
GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
glDrawBuffers(1,&atach0);
glClear(GL_DEPTH_BUFFER_BIT);
glViewport(0.0,0.0,640,480);
LProjection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,-500.0f,500.0f);
LView = glm::lookAt(glm::vec3(0.0f,15.0f,0.000001f),glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f));
LViewProjection = LProjection * LView;
glEnable(GL_DEPTH_TEST);
...CUBE3D
glBindFramebuffer(GL_FRAMEBUFFER,0);
glUniform1i(uniforTEX,0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,GL_DEPTH_MAP);
...DRAW-DEPTH-MAP!
glBindTexture(GL_TEXTURE_2D,0);
但是如果我这样做,它只会显示一个白屏,并且深度图不再可见。
GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
glDrawBuffers(1,&atach0);
glClear(GL_DEPTH_BUFFER_BIT);
glViewport(auxrecX,auxrecY,auxrcAn,auxrcAl);
LProjection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,-500.0f,500.0f);
LView = glm::lookAt(glm::vec3(0.0f,15.0f,0.000001f),glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f));
LViewProjection = LProjection * LView;
glEnable(GL_DEPTH_TEST);
...CUBE3D
glBindFramebuffer(GL_FRAMEBUFFER,0);
GLuint atach1 = GL_COLOR_ATTACHMENT0;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
glDrawBuffers(1,&atach1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,640,480);
Projection = glm::perspective(45.0f,1.333333f,0.01f,1000.0f);
View = glm::lookAt(glm::vec3(0.0f,0.0f,3.0),glm::vec3(0.0f,0.0f,-15.0f),glm::vec3(0.0f,1.0f,0.0f));
ViewProjection = Projection * View;
glEnable(GL_DEPTH_TEST);
...CUBE3D
glBindFramebuffer(GL_FRAMEBUFFER,0);
glUniform1i(uniforTEX,0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,GL_DEPTH_MAP);
...DO NOT DRAW NOTHING
glBindTexture(GL_TEXTURE_2D,0);
我需要按这个顺序做。因为第一个“pass”是为了在阴影贴图中使用深度贴图。我究竟做错了什么?
解决方案
GL_DEPTH_ATTACHMENT
对 无效glDrawBuffers
。glDrawBuffers
片段着色器数据的输出将写入的缓冲区的数量。
当你这样做
GLuint atach0 = GL_DEPTH_ATTACHMENT; glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
那么你会得到一个GL_INVALID_ENUM
错误。
如果您不想写入深度图,请禁用 use 的深度测试glDepthMask
。深度缓冲区附件不能打开和关闭,也不能像颜色缓冲区一样使用。
更远
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在任何情况下都会清除深度缓冲区。
我认为如何设置阴影贴图的帧缓冲区存在一个基本的误解。您只需要一个用于阴影贴图的帧缓冲区。此帧缓冲区必须只有一个深度缓冲区。
你必须以某种方式这样做:
GLuint fboShadow; // framebuffer with depth buffer only (shadow map)
GLuint toShadowDepth; // texture which is the depth buffer of `fboShadow`
glBindFramebuffer(GL_FRAMEBUFFER, fboShadow);
GLuint atach0 = GL_NONE;
glDrawBuffers(1, &atach0);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glViewport(auxrecX, auxrecY, auxrcAn, auxrcAl);
// draw the shadow map to the depth buffer only
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glViewport(0, 0, 640, 480);
glUniform1i(uniforTEX, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, toShadowDepth);
// draw the geometry to the default framebuffer by using the depth map
推荐阅读
- asp.net - IIS ASP.NET 模拟:指定了特定用户,但 User.Identity 为空
- java - 如何防止控制器方法在 Chrome 浏览器的 Spring Boot 中运行两次?
- react-native - Haste 模块地图中不存在模块`child_process`
- c++ - 使用枚举 vs 变量,存储非类型模板参数值。(在 Int2Type 内
模板) - python - 散景中的等高线图
- emacs - 文本导出正在扩展路径的一部分 - 如何抑制这一点?
- sql-server - 在数据库表中显示每个月的最后一个工作日。(工作日不包括周六、周日)
- android - Android序列(跳过方法)
- google-kubernetes-engine - 如何在 Java 应用程序中从 GKE 登录到 Stackdriver
- r - ggplot2,来自第 1 列的标签,但来自第 2 列的值是自动实现的,而不是手动实现的?