GLSL 1.5 - 渲染到纹理数组的不同层

时间:2013-01-25 15:40:04

标签: opengl glsl

我有GL_TEXTURE_2D_ARRAY,我这样做:

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

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

为了实现第一个目标,我添加了一个带有gl_Layer调用的几何几何着色器到每个基元。另外,我在我的着色器中实现了一些类似于this Nvidia tutorial的“翻译”的东西,我用它来渲染第二阶段。

那么,什么是 我的问题

条件:相同的顶点,相同的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();
}

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

gl_Layer,与一样,所有几何着色器输出都是每顶点输出。哪个顶点控制特定基元的图层为implementation-defined。在您的情况下,在EmitVertex调用之前,没有理由不在循环中设置它。