2

我有GL_TEXTURE_2D_ARRAY并且我这样做:

1.将我想要 FBO 的所有内容渲染到纹理数组

2.在渲染的“主要阶段”对该数组进行采样

为了实现第一个目标,我添加了一个小几何着色器,其中包含gl_Layer对每个图元的调用。另外,我已经在我的着色器中实现了一些类似于Nvidia 教程的“翻译” ,用于第二阶段的渲染。

那么,我的问题是什么:

条件:相同的顶点、相同的 FBO、相同的着色器、相同的纹理数组

1)glFramebufferTextureLayer在我的 FBO 中使用调用重新绑定渲染目标乘以工作正常。

2)将纹理数组保存为glFramebufferTexture并且仅更改gl_Layer值会导致意外行为(第一层(代码中的 0)是正确的,我接下来尝试渲染的每一层都是无效的)。

3)我不想1),我想做2)我怎么做?

我在渲染 FBO 时使用的着色器。

//顶点着色器

#version 150 core

uniform mat4 orthoView;
in vec4 in_Position;

void main(void) { 
    gl_Position = orthoView * in_Position; 
}

//几何学

#version 150 core

uniform int lr;

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
out int gl_Layer;

void main(void){
//pass-thru!
for(int i=0; i<3; i++)
  {
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }
gl_Layer = lr;
EndPrimitive();
}

//片段为空

编辑:

感谢大家的帮助!我的问题现在解决了,这是我的几何着色器:

#version 150 core

uniform int lr;

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

void main(void){
//pass-thru!
for(int i=0; i<3; i++)
  {
    gl_Layer = lr;
    gl_Position = gl_in[i].gl_Position;
    EmitVertex();
  }

EndPrimitive();
}
4

2 回答 2

3

gl_Layer,就像所有几何着色器的输出一样,每个顶点的输出。哪个顶点控制特定图元的层是实现定义的。在您的情况下,没有理由在EmitVertex通话之前不将其设置在您的循环中。

于 2013-01-25T20:42:12.920 回答
3

我之前实际上没有使用过 gl_Layer,但是查看文档,听起来它是一个每个顶点的属性(这很奇怪......)。

 The actual layer used will come from one of the vertices in the primitive being shaded

所以尝试在 for 循环中设置值,在 EmitVertex 之前,也许?

于 2013-01-25T17:10:05.320 回答