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