Правильно ли прикрепить объект Frame Buffer к 3D-текстуре с 8-битным внутренним форматом?
По сути, моя программа использует объект кадрового буфера для рендеринга в 3D-текстуру. Если 3D-текстура, которую я прикрепляю к fbo, имеет формат GL_RGB8, то есть 24 бита на тексель, проблем нет. Только 8-битные из них используются. Проблема возникает, когда я пытаюсь использовать GL_ALPHA8 (8 бит на тексель) в качестве внутреннего формата для 3D-текстуры, результат рендеринга будет пустым. Фрагмент шейдера cg, который я использовал для рендеринга в fbo, выглядит так:
void F_PureDecoder(
float3 vIndexCoord : TEXCOORD0,
out float color :COLOR)
{
... ...
color=float4(fL3,fL3,fL3,fL3);
}
Я делаю что-то не так или fbo не поддерживает рендеринг в 8-битную текстурную текстуру? Я в первую очередь не уверен, правильный ли формат вывода фрагмента шейдера. Ведь кадровый буфер имеет 8 бит, но выходной - 24 бита. Должен ли я изменить формат вывода из фрагмента шейдера? Если да, какой формат мне использовать?
Большое спасибо за любой вклад!
1 ответ
Для рендеринга в одну / две компонентные текстуры, вы ДОЛЖНЫ использовать расширение GL_ARB_texture_rg, оно НЕ будет работать с любым другим форматом. Посмотрите спецификацию расширения, чтобы узнать, почему оно не работает:
It is also desirable to be able to render to one- and two- component format textures using capabilities such as framebuffer objects (FBO), but rendering to I/L/LA formats is under-specified (specifically how to map R/G/B/A values to I/L/A texture channels).
Итак, используйте внутренний формат GL_R8. Чтобы записать в него, просто запишите полный вывод RGBA, но будет записан только компонент R.