首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FBO和纹理

FBO和纹理
EN

Stack Overflow用户
提问于 2019-02-25 03:52:44
回答 1查看 90关注 0票数 1

我给一个FBO附加了两个纹理。第一个纹理将用于显示深度图。第二种纹理将以正常的方式显示对象。

如果我这样做,它工作良好,并向我显示深度图。

代码语言:javascript
复制
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);

但如果我这样做,它只显示一个白色的屏幕和深度图不再可见。

代码语言:javascript
复制
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“是用于在阴影地图中使用深度地图。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-25 06:32:01

GL_DEPTH_ATTACHMENTglDrawBuffers无效。将从片段着色器数据写入输出的缓冲区的glDrawBuffers

当你做的时候

GLuint atach0 = GL_DEPTH_ATTACHMENT;glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);

然后您将得到一个GL_INVALID_ENUM错误。

如果您不想使用深度图,那么禁用使用glDepthMask的深度测试。深度缓冲区附件不能打开或关闭,也不能像彩色缓冲区那样使用。

进一步

[中英文摘要] glClear(GL_COLOR_BUFFER_BIT X GL_DEPTH_BUFFER_BIT);

在任何情况下都会清除深度缓冲区。

我认为一个基本的误解是如何设置阴影地图的框架缓冲区。您将只需要一个用于影子映射的帧缓冲区。此框架缓冲区必须仅具有深度缓冲区。

你必须像这样做麻省理工学院:

代码语言:javascript
复制
GLuint fboShadow;      // framebuffer with depth buffer only (shadow map)
GLuint toShadowDepth;  // texture which is the depth buffer of `fboShadow`
代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54859271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档