2016-05-17 54 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)。 –