Opengl FBO与纹理

Opengl FBO与纹理,opengl,glsl,fbo,Opengl,Glsl,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); LP

我已将两个纹理附加到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);

我需要按那个顺序做。因为第一个“过程”用于阴影贴图中的深度贴图。我做错了什么?

GL\u DEPTH\u附件对无效
glDrawBuffers
将片段着色器数据的输出写入其中的缓冲区

当你这样做的时候

然后您将得到一个
GL\u INVALID\u ENUM
错误

如果不想连接到深度贴图,请禁用使用的深度测试。深度缓冲区附件不能打开和关闭,也不能像颜色缓冲区那样使用

进一步

将在任何情况下清除深度缓冲区

我认为对于阴影贴图的帧缓冲区的设置有一个基本的误解。您只需要阴影贴图的帧缓冲区。此帧缓冲区必须仅具有深度缓冲区

你必须这样做:

GLuint fboShadow;//仅具有深度缓冲区的帧缓冲区(阴影贴图)
GLuint toShadowDepth;//纹理,它是“fboShadow”的深度缓冲区`
glBindFramebuffer(GL_FRAMEBUFFER,fboShadow);
GLuint atach0=GL_NONE;
glDrawBuffers(1和atach0);
glClear(GLU深度缓冲位);
glEnable(GLU深度试验);
glViewport(auxrecX、auxrecY、auxrcAn、auxrcAl);
//仅将阴影贴图绘制到深度缓冲区
glBindFramebuffer(GL_帧缓冲区,0);
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
glEnable(GLU深度试验);
glViewport(0,060480);
glUniform1i(uniforTEX,0);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,toShadowDepth);
//使用深度贴图将几何图形绘制到默认帧缓冲区

我要试试看。非常感谢你的回答,朋友。
GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);