Правильно ли прикрепить объект 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.

Другие вопросы по тегам