Criando e usando um LUT 3D no MAME

Introdução

O LUT é um acrônimo de "Look Up Table", é um arquivo que contém informações usadas para aplicar correções de cores (LUT técnico [1]) ou para fazer uma gradação de cores (alterar as cores) de uma maneira a aplicar certos efeitos ou para alterar o tom da imagem (LUT criativo) visando criar uma aparência diferente da original.

É muito comum a utilização de LUTs nas produções de vídeo e foto seja para dar uma certa aparência quente/fria/neutra a uma determinada cena ou para criar perfis personalizados para câmeras e para as lentes. Estes perfis servem para corrigir eventuais desvios ou até mesmo para fazer ajustes finos. Independentemente da marca ou do modelo do equipamento, é comum que eles apresentem desvios nas cores em determinadas condições de iluminação ou situações específicas, seja por causa do tipo da luz utilizada (natural ou artificial) ou por causa de fatores externos como a posição do sol em diferentes horários do dia, cenas com o tempo nublado, ambiente iluminado por velas e assim por diante.

Neste contexto, o LUT é utilizado para compensar ou para corrigir estas variações, garantindo que as cores de um determinado objeto, ou de uma pessoa, estejam consistentes em diferentes condições de luz. Por exemplo, um LUT pode ser criado para garantir que uma blusa com um tom específico de vermelho, apareça com a mesma tonalidade em diferentes condições de iluminação, proporcionando uma aparência visual uniforme durante todo o processo de produção.

Para aprender mais sobre LUT, consulte os links ao lado. [2] [3] [4]

A capacidade de aplicar LUT foi inserida no MAME em Outubro de 2018, porém, mesmo após o seu lançamento no MAME 0.203, não houve nenhum grande anúncio ou qualquer manifestação conhecida da comunidade. Talvez porque a grande maioria das pessoas sequer sabem para que serve ou como se usa um LUT.

Neste capítulo vamos aprender a criar e aplicar LUTs de correção de cores no sistema Nintendo Entertainment System ou NES emulado pelo MAME.

Criando um HaldCLUT

Para criar um CLUT que contenha todas as informações necessárias para corrigir as cores, é preciso seguir um processo que envolve o uso de uma imagem criada pelo MAME, que nos servirá como uma base e de uma outra imagem de referência, esta será usada como correção. Basicamente você está informando ao programa que o nosso alvo é corrigir as cores do MAME com as características da imagem de referência.

Se vamos criar um CLUT de correção de cores, antes de mais nada, nós precisamos ter uma referência que possamos confiar, assim sendo, eu criei uma tela com barras de cores SMPTE gerado no padrão BT.601 com luminância no intervalo 16,235 (nível de TV). Este é um padrão de teste utilizado até os dias de hoje pela indústria e pelos profissionais na produção de vídeo, cinema, televisão e fotografia para aferir a precisão das cores em uma ampla variedade de equipamentos utilizados na indústria audiovisual. Ele foi escolhido pois era o padrão da época, logo, eu sei de onde estou partindo quanto ao tom e a intensidade das cores, contudo, isso não garante que a correção das cores será fidedigna em todos os jogos, pois o MAME usa uma paleta dinâmica matematicamente calculada.

Para gerar a nossa imagem de referência, nós usamos o AviSynth+ e criamos um arquivo Colorbars.avs com o seguinte conteúdo:

# Color bars SD
ColorBars (550,480)
ConvertToRGB32(matrix="Rec601")

Arrastando o arquivo Colorbars.avs no Virtualdub2 nós obtemos a seguinte imagem:

barras coloridas no padrão SMPTE

Ela servirá como a referência de correção que será aplicada na imagem do MAME.

Nota

Para usuários de Linux e macOS, é possível obter tela semelhante usando o ffmpeg, depois de instalar o ffmpeg abra o terminal e rode o comando: ffmpeg -hide_banner -f lavfi -i smptebars=duration=10:size=550x480:rate=30 -pix_fmt yuv444p smptebars.mp4

Baixe o 240p-test-mini e salve na mesma pasta do MAME, ele será usado para gerar a tela com barras coloridas, usando o terminal ou prompt de comando faça:

mame nes -cart 240pee.nes -resolution 552x481 -noka -window -nofilter -video opengl

Pressione o botão "B" e selecione a opção SMPTE color bars, pressione Alt + PrtScn (Print Screen) para fazer uma captura da tela (no Windows ou Linux, para macOS use estas instruções), este é o resultado (já recortado):

barras coloridas no padrão SMPTE gerado pelo MAME

Nota

Caso tenha alguma dificuldade, aproveite as imagens acima que já estão recortadas no tamanho apropriado.

O que faremos agora é transferir as cores da imagem do MAME para a nossa imagem de referência. Isso é necessário pois, para criar um CLUT válido, ambas as imagens precisam ter o mesmo tamanho e as mesmas características, a única coisa que deve variar na imagem são as cores e mais nada (observe que a barra verde tem um tamanho diferente por exemplo), caso contrário, o resultado será diferente do esperado. Se não estiver interessado em aprender como criar um CLUT ou queira evitar todo este procedimento, baixe o arquivo NES_SMPTE.cube deste link e pule para a próxima etapa.

Para esta tarefa usaremos o Gimp com o plug-in G'MIC, abra a nossa imagem de referência no Gimp e duplique-a, nomeie esta primeira camada como "MAME" e a segunda como "REFERÊNCIA", é na camada "MAME" onde clonaremos as cores do MAME.

  • Abra o imagem do MAME (será criado uma nova aba), com o "Color Picker" ( O ) clique na primeira barra à esquerda para capturar a sua cor.

  • Volte para a primeira aba, selecione a ferramenta "Fuzzy Select Tool" ( U ), clique na camada "MAME" para selecioná-la, clique na primeira barra à esquerda para criar uma seleção ao redor da cor.

  • Em seguida escolha a ferramenta "Bucket Fill Tool" ( Shift + B ) e clique em cima da barra selecionada para preencher esta barra com as cores do MAME.

  • Repita este procedimento com todas as outras barras.

  • Selecione a camada "REFERÊNCIA", logo abaixo, clique na seta para cima para mover a camada para o topo. Assim você terá a primeira camada "REFERÊNCIA" e abaixo "MAME".

  • Vá em Filters > G'MIC-Qt..., depois em Available Filters, clique duas vezes em Color e clique em CLUT from After - Before Layers.

  • Em Output Mode selecione Save CLUT as .cube or .png File.

  • Em Output CLUT Resolution deixe em 64.

  • Em Output Folder defina uma pasta de destino para salvar o arquivo .cube.

  • Em Output Filename defina o nome do arquivo com a extensão .cube, aqui usaremos NES_SMPTE.cube.

  • Logo abaixo em Input / Output defina Input Layers como Active and below.

  • Em Output mode selecione In place (default).

  • Clique em OK para criar o arquivo NES_SMPTE.cube.

A imagem abaixo mostra todas as configurações, clique nela para ampliar (HTML) ou aproxime a página (PDF).

Configurações do GMIC

Agora todas as informações necessárias para aplicar as correções de cores estão armazenadas no arquivo NES_SMPTE.cube. Acredite, o processo é muito mais fácil quando trabalhamos com fotos.

Criando um LUT 3D para usar no MAME

O tipo de LUT compatível com o MAME é o 3D no formato 64x64x64 com 8-bit e PNG [5] [6]. Ele é criado usando o 3D Lut Maker que acompanha o DisplayCAL, ele é gratuito e está disponível para todos os sistemas operacionais, no Debian instale com o comando:

sudo apt install displaycal dispcalgui

No Windows é preciso baixar a versão para Windows no link acima e baixar também o Argyll Color Management (ArgyllCMS). Não é preciso baixar o instalador do DisplayCalc, baixe a versão ZIP e descompacte-o em algum lugar (menos em C:\), depois de baixar o ArgyllCMS, descompacte-o dentro da pasta do DisplayCalc. Quando iniciar o programa DisplayCAL-3DLUT-maker, ele vai te questionar para localizar a pasta onde se encontra os executáveis do ArgyllCMS, direcione o explorer para a pasta onde você descompactou o ArgyllCMS, entre na pasta bin e clique em "selecionar pasta" para que o programa inicie corretamente.

Aqui as configurações utilizadas no Linux:

Configurações usadas para criar o 3D LUT com gamma 2.2

Aqui as configurações utilizadas no Windows:

Configurações usadas para criar o 3D LUT com gamma 2.2

Ao clicar em Create 3D LUT o programa cria diversos arquivos diferentes, porém, o que nos interessa é esta imagem aqui:

Configurações usadas para criar o 3D LUT com gamma 2.2

Esse é o nosso LUT 3D base, é nele que aplicaremos as correções de cores, e depois a partir dele, que exportaremos um novo LUT 3D com as correções que desejamos. As opções escolhidas foram as que me pareceram mais corretas. Faça você mesmo os seus próprios testes com outros parâmetros e veja como fica.

Diferenças nas cores

De todos os diferentes emuladores existentes que emulam o NES apresentam uma paleta de cores diferente entre si (incluindo o MAME) e não existe (até onde eu saiba) um consenso sobre qual deveria ser a paleta de cores "mais correta" para o NES pois a sua PPU não gera sinais de vídeo em RGB ficando a cargo do circuito interno da TV da pessoa interpretar as cores que chegavam nela, a partir daí começa toda essa confusão, pois os circuitos internos das TVs eram diferentes, assim sendo, as cores variavam de uma TV para outra. No MAME por exemplo, a paleta de cores é matematicamente calculada, já outros emuladores utilizam outros algoritmos ou paletas para apresentar as cores na tela.

Veja como fica ao colocarmos a nossa imagem de referência ao lado da imagem gerada pelo MAME, repare na diferença do tom e na intensidade das cores:

Comparando a imagem de referência com o padrão gerado pelo MAME.

Barras de cores SMPTE (NTSC) BT.601

MAME 0.252

barras coloridas no padrão SMPTE

barras coloridas no padrão SMPTE gerado pelo MAME

Com o nosso CLUT e o nosso LUT 3D base criados, nós já temos o nosso ponto de partida para dar início a criação do nosso LUT 3D de correção, o procedimento é o seguinte:

  • Abra a imagem do LUT 3D base que criamos acima com o Gimp.

  • Vá em Filters > G'MIC-Qt..., depois em Available Filters, clique duas vezes em Color e escolha Apply Extrenal CLUT.

  • Em Specify HaldCLUT As escolha Filename.

  • Em HaldCLUT Filename procure pelo arquivo NES_SMPTE.cube.

  • Em Normalize Colors selecione Both.

  • Em Preview Type selecione Full.

  • Em Input layers deixe em Active (default).

  • Em Output mode deixe em In place (default).

  • Clique em Ok para aplicar as correções.

Veja na imagem abaixo como ficou as nossas opções:

Base 3D LUT com gamme 2.2

Observe que não é necessário alterar qualquer outra configuração (brilho e contraste por exemplo), pois tudo o que precisamos já está no arquivo NES_SMPTE.cube. Mesmo quando trabalhamos com fotos ou geramos LUT para diferentes finalidades, todos os ajustes finos que precisamos fazer na imagem é feito antes de se criar o arquivo *.cube e não depois. Claro que é possível fazer alguns ajustes finos se for necessário, mas, para a nossa finalidade aqui com o MAME os ajustes que já foram feitos são suficientes.

Nota

Geralmente quando baixamos um LUT externo (geralmente um LUT criatvo) criado por outra pessoa é que estes controles se tornam úteis, servem como um ajuste fino no efeito que desejamos aplicar. Porém com o MAME mesmo pequenos ajustes podem extrapolar o efeito desejado.

Vá em File > Export As... ( Shift + Ctrl + E ) e salve o arquivo com um nome bacana como NES_SMPTE.png dentro da pasta Artwork do MAME.

Este é o LUT 3D NES_SMPTE.png que acabamos de criar:

LUT 3D NES SMPTE

Para ver se funcionou ou não, crie o arquivo ini\source\nes.ini com o seguinte conteúdo:

video bgfx
bgfx_backend d3d11
bgfx_screen_chains lut
bgfx_lut NES_SMPTE.png

Para quem usa HLSL no Windows:

video d3d
hlsl_enable 1
filter 0
lut_enable 1
lut_texture NES_SMPTE.png
saturation 1.36

Nota

Caso tenha problemas com o d3d (o efeito não funciona ou o LUT não é aplicado por exemplo), consulte o capítulo Usando o HLSL no Windows 8/10/11 sem precisar instalar o DirectX 9.

Para Linux/macOS tente:

video bgfx
bgfx_backend vulkan # (tente opengl ou auto caso não funcione)
bgfx_screen_chains lut
bgfx_lut NES_SMPTE.png
prescale 5

Rode o comando abaixo no teminal ou no prompt de comando e veja o resultado:

mame nes -cart 240pee.nes -noka

Pressione o botão "B" e selecione a opção SMPTE color bars, veja na imagem abaixo como o próprio MAME é capaz de aplicar as devidas correções em tempo real:

O próprio MAME usando um LUT 3D para aplicar as correções de cores.

Barras de cores SMPTE (NTSC) BT.601

MAME 0.252 com um LUT de correção

barras coloridas no padrão SMPTE

barras coloridas corrigidas pelo LUT 3d

As paletas de cores

Nota

Até a presente data em que escrevo este capítulo, não há suporte para o uso de paleta de cores de qualquer tipo na versão mais recente do MAME (0.252).

Se pesquisar na internet, é possível encontrar diferentes sites (como este) que disponibilizam uma grande variedade de paletas de cores (elas vem com a extensão .pal) que são utilizadas por outros emuladores como o nestopia, Mesen2, FCEUX, dentre vários outros, para que estes emuladores consigam gerar cores na tela com um determinado padrão, ou obedece certos parâmetros de cores determinada pelos seus criadores. Para obter mais informações, consulte os links ao lado (todos em Inglês). [7] [8] [9]

Para compreender como funciona a geração dos gráficos no NES, consulte o link ao lado (em Inglês). [10]

Dada a grande variedade de paletas e como não existe (até o presente momento) uma paleta definitiva para o NES, eu escolhi a paleta do ROM Detectives por uma simples questão de gosto, geralmente é assim que acontece, das várias disponíveis você usa aquelas que mais gosta.

Paleta do ROM Detectives

ROM Detectives NES Palette

Paleta do ROM Detectives

Aqui a mesma paleta convertida num arquivo chamado NES_NTSC.pal.

00000000  7c 7c 7c 00 00 fc 00 00  bc 44 28 bc 90 00 84 a8  ||||......D(.....|
00000010  00 20 a8 10 00 88 14 00  50 30 00 00 78 00 00 68  |. ......P0..x..h|
00000020  00 00 58 00 00 40 58 00  00 00 00 00 00 00 00 00  |..X..@X.........|
00000030  bc bc bc 00 78 f8 00 58  f8 68 44 fc d8 00 cc e4  |....x..X.hD.....|
00000040  00 58 f8 38 00 e4 5c 10  ac 7c 00 00 b8 00 00 a8  |.X.8..\..|......|
00000050  00 00 a8 44 00 88 88 00  00 00 00 00 00 00 00 00  |...D............|
00000060  f8 f8 f8 3c bc fc 68 88  fc 98 78 f8 f8 78 f8 f8  |...<..h...x..x..|
00000070  58 98 f8 78 58 fc a0 44  f8 b8 00 b8 f8 18 58 d8  |X..xX..D......X.|
00000080  54 58 f8 98 00 e8 d8 78  78 78 00 00 00 00 00 00  |TX.....xxx......|
00000090  fc fc fc a4 e4 fc b8 b8  f8 d8 b8 f8 f8 b8 f8 f8  |................|
000000a0  a4 c0 f0 d0 b0 fc e0 a8  f8 d8 78 d8 f8 78 b8 f8  |..........x..x..|
000000b0  b8 b8 f8 d8 00 fc fc f8  d8 f8 00 00 00 00 00 00  |................|

Novamente, até o momento, o MAME não é compatível com paletas externas, assim sendo, precisamos converter a paleta em LUT 3D.

Nota

O nosso LUT 3D base deve estar limpo e sem nenhum efeito ao aplicar uma nova correção. Então, caso a correção do processo anterior já esteja aplicado, faça um Ctrl + Z para desfazer a correção e só então, aplique uma nova. Na dúvida e sem salvar nada, feche a aba com o LUT 3D base, abra-a novamente, aplique as novas correções e só então exporte como NES_NTSC.png. Se não fizer isso, haverá duas correções diferentes no mesmo arquivo e o resultado final será muito diferente do desejado.

  • Carregue a ROM 240p-test-mini no nestopia, Mesen2, FCEUX ou qualquer outro emulador que aceite paleta de cores.

  • Configure o vídeo para que ele tenha o dobro de tamanho do original.

  • Pressione o botão "B" e selecione a opção SMPTE color bars.

  • Carregue e aplique a paleta NES_NTSC.pal.

  • Pressione Alt + PrtScn (Print Screen) para fazer uma captura da tela (no Windows ou Linux, para o macOS use estas instruções), encerre o emulador.

  • Abra o Gimp e cole a imagem, dê o nome de "CORREÇÃO".

  • Use a captura anterior) e cole no Gimp, dê o nome de "MAME".

  • Faça os ajustes necessários para que ambas as imagens fiquem alinhadas.

  • Faça um recorte (crop) para que ambas tenham exatamente o mesmo tamanho.

  • Mova a camada "MAME" para baixo, deixando a camada "CORREÇÃO" em primeiro.

  • Vá em Filters > G'MIC-Qt..., depois em Available Filters, clique duas vezes em Color, clique em CLUT from After - Before Layers.

  • Em Output Mode selecione Save CLUT as .cube or .png File.

  • Em Output CLUT Resolution deixe em 64.

  • Em Output Folder defina uma pasta de destino para salvar o arquivo .cube.

  • Em Output Filename defina o nome do arquivo com a extensão .cube, aqui usaremos NES_NTSC.cube.

  • Logo abaixo em Input / Output defina Input Layers como Active and below.

  • Em Output mode selecione In place (default).

  • Clique em OK para criar o arquivo NES_NTSC.cube.

  • Faça o procedimento descrito em Diferenças nas cores para aplicar o CLUT NES_NTSC.cube no LUT 3D base que criamos.

  • Vá em File > Export As... ( Shift + Ctrl + E ) e salve o arquivo como NES_NTSC.png dentro da pasta Artwork do MAME.

Ao concluir estas etapas, agora nós temos o LUT 3D NES_NTSC.png:

LUT 3Dda paleta NES NTSC do ROM Detectives

Para testar, edite o arquivo ini\source\nes.ini e substitua a opção NES_SMPTE.png por NES_NTSC.png e salve. Agora teste um jogo qualquer do NES e veja como fica, tente o Batman por exemplo:

mame nes batmanu

Usando a própria interface do MAME, é possível alternar entre os dois LUTs 3D que criamos (NES_NTSC e o NES_SMPTE):

  • Pressione Tab.

  • Selecione Controles deslizantes.

  • Mova o cursor até Window 0, Screen 0 LUT Texture.

  • Selecione esquerda ou direita para alternar entre os LUTs.

Para quem tiver interesse, aqui está a paleta NES_SMPTE.pal.

Paleta Mamedoc SMPTE

Mamedoc NES SMPTE Palette

Paleta SMPTE

00000000  85 7a 7d 07 03 de 09 04  c0 3b 0e 9a a7 03 83 bc  |.z}......;......|
00000010  02 15 bc 0c 01 9f 11 03  5b 37 03 02 9a 05 02 88  |........[7......|
00000020  07 02 74 07 06 3e 69 00  00 00 00 00 00 00 00 00  |..t..>i.........|
00000030  c8 c9 c9 03 73 e4 03 4b  e0 70 2e d4 d2 01 ce da  |....s..K.p......|
00000040  01 4a e6 28 00 d7 4c 0c  bb 7a 03 01 c6 01 01 bf  |.J.(..L..z......|
00000050  01 04 af 3b 05 7f 8f 00  00 00 00 00 00 00 00 00  |...;............|
00000060  ff ff ff 1e ba d6 51 81  d8 a4 72 de e1 7b e4 de  |......Q...r..{..|
00000070  4a a2 dc 72 44 d6 a3 24  e3 c1 01 c0 dc 0d 4f cf  |J..rD..$......O.|
00000080  49 3a d6 93 06 de d5 80  74 77 00 00 00 00 00 00  |I:......tw......|
00000090  ff ff ff 91 e4 ea c4 c8  e0 dd c7 e8 ea c4 eb dc  |................|
000000a0  b3 ca e2 d8 bd e8 e0 b1  e1 d6 6d d6 e1 6d c5 e0  |..........m..m..|
000000b0  c7 b9 eb e0 06 e8 e8 f3  e4 f3 00 00 00 00 00 00  |................|

O processo de criação desta paleta é semelhante ao que já foi explicado:

  • Abra a imagem da paleta do ROM Detectives no Gimp.

  • Vá em Filters > G'MIC-Qt..., depois em Available Filters, clique duas vezes em Color e escolha Apply Extrenal CLUT.

  • Em Specify HaldCLUT As escolha Filename.

  • Em HaldCLUT Filename procure pelo arquivo NES_SMPTE.cube.

  • Em Normalize Colors selecione Both.

  • Em Preview Type selecione Full.

  • Em Input layers deixe em Active (default).

  • Em Output mode deixe em In place (default).

  • Clique em Ok para aplicar as correções.

Extraia os valores em hex ("html notation" no Gimp) das cores e cole num editor hexadecimal e salve como nome_da_paleta.pal.

Eu compilei um conjunto de 37 LUTS, incluindo os que criamos aqui neste documento, quem tiver interesse de baixar e experimentar, baixe aqui (nova versão 2023, as tabelas de cores foram atualizadas e corrigidas para o MAME 0.261 ou mais recente), descompacte os arquivos .png dentro da pasta artwork. Você pode ou configurar uma paleta específica em ini\source\nes.ini ou usar a própria interface do MAME para alternar entre elas como já foi explicado anteriormente.

Nota

Agora estes LUTs também estão disponíveis através do site do MAMEDEV em mame-goodies.

Nota

Para remover o efeito "blur" (borrado) nas versões OpenGL do MAME durante o uso de Luts com o nes, use a opção prescale no arquivo ini\source\nes.ini. O valor 5 (médio), remove todo o efeito.