OpenGL Texture3D FragmentShader写入图层

时间:2016-05-17 21:58:55

标签: opengl fragment-shader 3d-texture

我想过滤纹理(无mipmapping)并将过滤后的等级写入3D纹理。我已经使用以下代码创建了一个3D纹理:

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)...我可以写它穿上制服并多次渲染,但如果有一种方法可以一次通过......那就太好了:)

1 个答案:

答案 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;
}