2016-05-17 42 views
1

我想过滤一个纹理(没有mipmapping),并将过滤后的关卡写入3D纹理。我已经创建了一个三维纹理与下面的代码:OpenGL Texture3D FragmentShader写入图层

glGenTextures(1, &outTexture); 
glBindTexture(GL_TEXTURE_3D, outTexture); 
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, width, height, layer, 0, GL_RGBA, GL_INT, 0); 
glBindTexture(GL_TEXTURE_3D, 0); 

,我使我的模型,像这样:

glFramebufferTexture3D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_3D, outTexture, 0, layer); 
entity.render(); 

是有一个片段着色器写入到多层在同一种方式时间和知道你在哪一层?像这样?

out_color[layer] = vec4(r,g,b,a); 

PS:我需要知道在片段着色器,其层(一些&取悦没有gl_Layer滤波东西...只能在OpenGL的4使用,并且我只能使用OpenGL 3)...余可以将它写入一个制服并渲染多次,但是如果有一种方法可以用一次传递......这将是很好的:)

+0

“*没有gl_Layer ......只能在使用OpenGL 4和我只能使用OpenGL 3 *“嗯,[分层渲染](https://www.opengl.org/wiki/Layered_Rendering)不需要OpenGL 4.x. –

+0

但在片段着色器中OpenGL 4是必需的,正如我所说的,我需要知道在哪一层我是在片段着色器 – TreCore

+0

然后将该层手动传递给片段着色器*。 –

回答

0

片段着色器的一个实例不能选择它正在写什么层至。这是由几何着色器选择的,该着色器构造了生成所述片段的基元。所以如果你想渲染到多个图层,你需要使用layered rendering and GS's

如果您的片段着色器需要知道哪一层是写,然后有几何着色器传递的每个顶点参数:

//Geometry shader 
flat out int layerIndex; 

void main() 
{ 
    for(int currLayer = 0; currLayer < numLayers; ++currLayer) 
    { 
    for(int currVertex = 0; currVertex < gl_in.length(); ++currVertex) 
    { 
     layerIndex = currLayer; 
     gl_Layer = currLayer; 
     //Compute other per-vertex outputs 
     EmitVertex(); 
    } 
    EndPrimitive(); 
    } 
    EmitVertex(); 
} 

//Fragment shader 
flat in int layerIndex; 

void main() 
{ 
    //Do stuff with layerIndex; 
} 
+0

是layerIndex的每个顶点参数? 如果我EmitVertex()...当前的layerIndex将被下一个“layerIndex = currLayer;”复制并且不会更改? – TreCore

+0

@TreCore:...什么?这没什么特别的。这里是基本的几何着色器功能:[将值写入输出变量,然后调用'EmitVertex()'](https://www.opengl.org/wiki/Geometry_Shader#Outputs)。 –