Quero fazer o anti-aliasing de tela cheia no OpenGL e não quero usar o anti-aliasing fornecido pelo próprio OpenGL, pois estou construindo um jogo e quero bons efeitos nele.
Como devo proceder?
Quero fazer o anti-aliasing de tela cheia no OpenGL e não quero usar o anti-aliasing fornecido pelo próprio OpenGL, pois estou construindo um jogo e quero bons efeitos nele.
Como devo proceder?
Respostas:
Existem várias alternativas para o MSAA nativo no OpenGL. Com os efeitos de pós-processamento, a melhor coisa sobre eles é que você pode simplesmente colocar o sombreador na imagem final não processada e isso faz o resto. Aqui estão três métodos que vale a pena dar uma olhada:
Anti-aliasing rápido e aproximado (Geeks3D) - bom na maioria dos casos. Muito fácil de aplicar e entender. A desvantagem é nítida, o ruído de alto contraste nas texturas fica um pouco desfocado. Bordas tão sutis quanto íngremes de 1/4 de pixels parecem extremamente precisas como o MSAA tradicional. Menos íngreme que isso, perde um pouco de precisão.
Anti-aliasing filtrado normal (GameDev ) - Ainda não foi testado com precisão, mas é o mais fácil de entender. Na melhor das hipóteses, lembra 16x MSAA e, na pior das hipóteses, é como 2x MSAA. Ele gera um mapa normal temporário para representar arestas e ângulos relativos. Você pode experimentar o mapa normal com diferença de luminosidade ou diferença de cor.
Anti-aliasing morfológico (Iryoku) - foi aprimorado para SMAA - Subpixel Mophological AA. É bastante complexo em 4 passagens, mas alcança os melhores resultados que eu já vi. Cria gradientes ao longo das arestas tão graduais quanto 1/100 a 1/200 pixels íngremes (!). A amostragem pode ser baseada em luma, em cores ou em profundidade. As texturas ficam muito nítidas e limpas. (o exemplo é baseado em DX10 e HLSL, levaria algum tempo para portá-lo para GLSL com precisão)
Essas técnicas não fazem superamostras ou várias amostras, portanto, as linhas que aparecem com menos de 1 pixel de espessura aparecerão com intervalos e não serão suavizadas. Esta é a desvantagem de usar uma abordagem que não seja da MSAA. Como você está trabalhando apenas com uma imagem rasterizada em resolução total, não é possível criar informações adicionais a partir dessas lacunas vazias.
Observe que todas essas técnicas dependem da amostragem dos valores adjacentes de luma (brilho) ou croma (cor). O cálculo da luma e da correção de gama opcional requer instruções adicionais no shader AA, embora seja bastante direto. Você pode descarregar isso calculando a luma no shader anterior que fornece a imagem não retocada, armazenando a luma no canal alfa. Em seguida, no shader AA, você simplesmente experimentará o alfa.
Existem várias maneiras de fazer o antialiasing. Uma é usar o anti-aliasing de várias amostras (MSAA), onde seu buffer traseiro realmente armazena várias amostras de sub-pixel e, quando você renderiza triângulos, linhas etc., o sistema preenche automaticamente o conjunto correto de amostras em cada pixel. Em seguida, no final da renderização, a imagem é "resolvida" calculando a média de todas as amostras de subpixels para obter uma amostra por pixel.
Outra maneira é usar o antialiasing de pós-processamento, onde você renderiza a cena como normal e depois faz um desfoque direcionado no resultado final para ocultar bordas com alias. Existem várias técnicas para isso, mas uma das melhores / mais populares no momento é chamada FXAA (Anti-Aliasing rápido e aproximado).
O MSAA geralmente fornece resultados melhores do que o AA de pós-processamento, mas pode ser mais lento porque requer aproximadamente o dobro da largura de banda da memória para cada operação de renderização. O MSAA também pode exigir mais memória de vídeo que o AA pós-processamento, dependendo dos detalhes da instalação.
Você pode encontrar informações específicas sobre a implementação do MSAA ou FXAA na Web - basta pesquisar no google um desses termos.