C++ 几何体着色器和深度FBO

C++ 几何体着色器和深度FBO,c++,opengl,glsl,fbo,geometry-shader,C++,Opengl,Glsl,Fbo,Geometry Shader,当涉及几何体着色器时,是否有关于渲染到FBO的特殊规则 背景: 我尝试在场景中实现阴影贴图,其中包括以不同方式渲染的不同类型的对象: 网格,通过VBO和着色器以标准方式渲染 点精灵粒子,使用顶点和片段着色器渲染 四边形粒子,作为点发送,但在几何体着色器中扩展为四边形 我用标准的方法做阴影贴图,包括创建一个深度FBO,并从灯光的角度渲染对象的深度。网格和点精灵工作正常,但几何体着色器四元粒子的深度不会渲染到FBO 是标准(非FBO)深度缓冲区。请注意前景中的大圆形粒子 与渲染到FBO的视图相同。请

当涉及几何体着色器时,是否有关于渲染到FBO的特殊规则

背景: 我尝试在场景中实现阴影贴图,其中包括以不同方式渲染的不同类型的对象: 网格,通过VBO和着色器以标准方式渲染 点精灵粒子,使用顶点和片段着色器渲染 四边形粒子,作为点发送,但在几何体着色器中扩展为四边形

我用标准的方法做阴影贴图,包括创建一个深度FBO,并从灯光的角度渲染对象的深度。网格和点精灵工作正常,但几何体着色器四元粒子的深度不会渲染到FBO

是标准(非FBO)深度缓冲区。请注意前景中的大圆形粒子

与渲染到FBO的视图相同。请注意,仅绘制网格和点精灵粒子的深度

我的FBO设置如下(基于OpenGL 4着色语言手册第7章):

当然,深度测试是启用的。我已经通过gDebugger运行过了,它根本检测不到任何错误。我试着告诉片段着色器实际绘制东西,但这也没有什么区别(noe尝试将不同的值写入gl_FragDepth)

点精灵粒子和四边形粒子之间的唯一区别是使用几何体着色器。我在同一时间使用相同的统一值(相同的变换矩阵)进行渲染,并运行gDebugger来确保

我已经在一台装有nVidia GTX 560 Ti、驱动程序版本为8.17.13.142(我相信是撰写本文时的最新版本)和另一台装有Radeon Mobility HD 5650的计算机上进行了测试。我在这两方面都得到了相同的结果


我是否犯了任何明显的错误,或者有一些具体的事情我应该知道吗?

no geometry shader(无几何体着色器)怎么办?或者只是简单的穿透几何体着色器?你绝对确定近平面和远平面在这两种情况下都是相同的吗?@Bццћ-太好了!我尝试简化几何体着色器(这样它将输出一个点而不是四顶点三角形条带),发现它现在实际上正在投射(微小)阴影。因此,我慢慢地重新构建着色器,发现顶点的创建顺序错误(即使粒子本身是这样渲染的,并且它们可以工作)。我换了一下,效果很好,太好了。很高兴这有帮助:)
const bool Renderer::generateShadowMap(FBO & f, string & error) {
  uint depthTexID;
  uint width = f.getWidth();
  uint height = f.getHeight();
  glGenTextures(1, &depthTexID);
  glBindTexture(GL_TEXTURE_2D, depthTexID);
  glTexImage2D( GL_TEXTURE_2D,  0,       GL_DEPTH_COMPONENT,
  width,        height, 0,
  GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
  float border[] = {1.0, 0.0, 0.0, 0.0};
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
  glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
    GL_COMPARE_REF_TO_TEXTURE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS);
  glActiveTexture(GL_TEXTURE1);
  glBindTexture(GL_TEXTURE_2D, depthTexID);
  uint fID;
  glGenFramebuffers(1, &fID);
  glBindFramebuffer(GL_FRAMEBUFFER, fID);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,             
    depthTexID, 0);
  glDrawBuffer(GL_NONE);
  if(!checkFBOstatus(error)) {
        cerr << error << endl;
           return false;
  }
  glClearDepth(1.0);
  glClear(GL_DEPTH_BUFFER_BIT);
  glBindFramebuffer(GL_FRAMEBUFFER, 0);
  glActiveTexture(GL_TEXTURE0);
  f.setFBOID(fID);
  f.setTexID(depthTexID);
  return true;
}
//VERTEX SHADER
#version 400
in vec3 aPosition;
in float aSize;
out float gSize;
uniform mat4 vWorldView;
void main() {
  gSize = aSize;
  vec4 v4Vertex = vec4(aPosition.xyz, 1.0);
  vec4 transformedVertex = vWorldView * v4Vertex;
   gl_Position = transformedVertex;
}
//GEOMETRY SHADER
#version 400
layout (points) in;
layout (triangle_strip, max_vertices = 4) out;
in float gSize[1];
uniform mat4 vgProjection;
void main() {
 vec4 oPosition;

  float halfSize = gSize[0] * 0.5;
  oPosition = (vec4(-halfSize, -halfSize, 0.0, 0.0) + gl_in[0].gl_Position);
  gl_Position = vgProjection * oPosition;
  EmitVertex();

  oPosition = (vec4(halfSize, -halfSize, 0.0, 0.0) + gl_in[0].gl_Position);
  gl_Position = vgProjection * oPosition;
  EmitVertex();

  oPosition = (vec4(-halfSize, halfSize, 0.0, 0.0) + gl_in[0].gl_Position);
  gl_Position = vgProjection * oPosition;
  EmitVertex();

  oPosition = (vec4(halfSize, halfSize, 0.0, 0.0) + gl_in[0].gl_Position);
  gl_Position = vgProjection * oPosition;
  EmitVertex();

    EndPrimitive();
}
//FRAGMENT SHADER - empty as depth should be written automatically
#version 400
void main() {
}