OpenGL Texture3D FragmentShader Запись в слои

Я хочу отфильтровать текстуру (без отображения) и записать отфильтрованные уровни в 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 ответ

Решение

Экземпляр фрагментного шейдера не может выбрать, в какой слой он пишет. Это выбрано для него геометрическим шейдером, который создал примитив, который генерирует рассматриваемый фрагмент. Поэтому, если вы хотите визуализировать несколько слоев, вам нужно будет использовать многоуровневый рендеринг и GS.

Если ваш фрагментный шейдер должен знать, в какой слой он пишет, то пусть геометрический шейдер передает его в качестве параметра для каждой вершины:

//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;
}
Другие вопросы по тегам