Qual é o conceito e as diferenças entre o Framebuffer e o Renderbuffer no OpenGL?

136

Estou confuso sobre o conceito de Framebuffer e Renderbuffer. Sei que eles precisam renderizar, mas quero entendê-los antes do uso.

Eu sei que algum buffer de bitmap é necessário para armazenar o resultado do desenho temporário. O buffer de fundo. E o outro buffer deve ser visto na tela quando esses desenhos estiverem em andamento. O buffer frontal. E vire-os e desenhe novamente. Conheço esse conceito, mas é difícil conectar esses objetos a esse conceito.

Qual é o conceito e as diferenças deles?

eonil
fonte
7
Renderbuffer é um componente semelhante a um canal (cor, estêncil, profundidade e etcs) do Framebuffer. Veja: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil
2
O link é específico do iPhone, mas os framebuffers estão bem explicados.
j00hi

Respostas:

62

Esta página tem alguns detalhes que acho que explicam bastante bem a diferença. Primeiramente:

O destino final de renderização do pipeline OpenGL é chamado de [o] framebuffer .

Enquanto que:

Objeto Renderbuffer
Além disso, o objeto renderbuffer foi recentemente introduzido para renderização fora da tela. Ele permite renderizar uma cena diretamente em um objeto renderbuffer, em vez de renderizar em um objeto de textura. Renderbuffer é simplesmente um objeto de armazenamento de dados que contém uma única imagem de um formato interno renderizável. É usado para armazenar buffers lógicos do OpenGL que não possuem o formato de textura correspondente, como estêncil ou buffer de profundidade.

ChrisF
fonte
196

O objeto Framebuffer não é realmente um buffer, mas um objeto agregador que contém um ou mais anexos que, por sua vez, são os buffers reais. Você pode entender o Framebuffer como estrutura C, onde cada membro é um ponteiro para um buffer. Sem nenhum anexo, um objeto Framebuffer tem uma pegada muito baixa.

Agora, cada buffer anexado a um Framebuffer pode ser um Renderbuffer ou uma textura .

O Renderbuffer é um buffer real (uma matriz de bytes, números inteiros ou pixels). O Renderbuffer armazena valores de pixel em formato nativo, por isso é otimizado para renderização fora da tela. Em outras palavras, desenhar em um Renderbuffer pode ser muito mais rápido que desenhar em uma textura. A desvantagem é que os pixels usam um formato nativo dependente da implementação, de modo que a leitura de um Renderbuffer é muito mais difícil do que a leitura de uma textura. No entanto, uma vez que um Renderbuffer tenha sido pintado, pode-se copiar seu conteúdo diretamente para a tela (ou para outro Renderbuffer , eu acho), muito rapidamente, usando operações de transferência de pixels. Isso significa que um Renderbuffer pode ser usado para implementar eficientemente o padrão de buffer duplo que você mencionou.

Renderbuffers são um conceito relativamente novo. Antes deles, um Framebuffer era usado para renderizar em uma textura , que pode ser mais lenta porque uma textura usa um formato padrão. Ainda é possível renderizar uma textura, e isso é bastante útil quando é necessário executar várias passagens sobre cada pixel para criar uma cena ou desenhar uma cena na superfície de outra cena!

O wiki do OpenGL possui esta página que mostra mais detalhes e links.

fernacolo
fonte
13
Obrigado! Explicá-lo como uma espécie de estruturas e ponteiros faz muito mais sentido para mim.
usar o seguinte
2
Isso ainda é um pouco confuso para mim. Se renderbuffer permitir apenas uma cópia rápida para outro buffer de renderização, quase não haverá utilidade para isso! Se eu tiver que fazer um estágio de pós-processamento (como SSAO), não é mais fácil renderizá-lo para o framebuffer padrão usando anteriormente renderizado para Textures do que renderizá-lo para um RenderBuffer e depois copiar de volta para a tela?
CoffeDeveloper
4
Os buffers de renderização não foram projetados para pós-processamento personalizado. Eles podem ser usados ​​para armazenar informações de profundidade e estêncil para um procedimento de desenho. Isso é possível porque somente a própria implementação da GPL precisa ler os dados do buffer de renderização e tende a ser mais rápida que as texturas, porque usa um formato nativo. Se você precisar de pós-processamento, use texturas.
Fernacolo