Recapitulando, uma grande parte do pipeline gráfico é realizado pelo GTE. Isso inclui a transformação de perspectiva (que projeta o espaço 3D em um plano 2D usando a perspectiva da câmera) e a iluminação. Os dados processados são então enviados para a GPU proprietária da Sony para renderização.
Organizando o conteúdo
O sistema possui 1 MB de VRAM que é usada para armazenar o buffer de imagem (do inglês, frame buffer), texturas e outros recursos que a GPU precisa para renderizar uma cena. A CPU pode preencher essa área usando o DMA.
O tipo de chip utilizado (VRAM) é de duas portas, como no Virtual Boy. A VRAM utiliza dois barramentos de 16 bits, o que possibilita o acesso simultâneo entre a CPU/DMA/GPU e o codificador de vídeo.

Layout de memória usando VRAM.

Layout de memória usando SGRAM.
Embora em revisões posteriores do console, a Sony tenha mudado para chips SGRAM (a opção de porta única usando um barramento de dados de 32 bits individuais). Que pena!... Bem, para ser justo, cada um tem suas vantagens e desvantagens. Uma coisa é certa, devido às diferenças de temporização, jogos posteriores (como Jet Moto 3) exibirão gráficos com falhas quando executados nos sistemas baseados em VRAM. Se você quiser saber os detalhes, o documento "Nocash PSX Specifications" de Martin Korth descreve as diferentes temporizações e outras especificações .
Desenhando a cena
Se você leu o artigo sobre o Sega Saturn, deixe-me dizer que o projeto desta GPU é muito mais simples!
Agora, para mostrar como uma cena é desenhada, vou usar principalmente como exemplo o jogo Spyro: Year of the Dragon da Isomniac. Por favor, tenha em mente que a resolução interna deste jogo é muito baixa (292x217 píxeis), o que impede uma análise clara de cada estágio, então eu aumentei um pouco a escala para fins de demonstração. Aqui é uma amostra na escala original se você estiver curioso.
Comandos

Pipeline básico de comandos da GPU.
Para começar, a CPU envia dados de geometria (vértices) para a GPU preenchendo seu buffer FIFO interno de 64 bytes com comandos (até três). Basicamente, um comando declara como e onde desenhar uma primitiva.
Uma vez que a geometria é recebida, é aplicado o recorte para evitar operações nos polígonos não vistos (localizados fora do campo de visão da câmera).
A localização da primitiva é declarada com um sistema de coordenada X, Y apontando para o buffer de imagem. A GPU do PS1 emprega um modelo de coordenadas inteiras, onde cada coordenada corresponde ao ponto central de um píxel (chamado de ponto de amostragem). Em outras palavras, não há coordenadas fracionárias.
Abordagem de visibilidade

Crash Bandicoot (1996). Este jogo usava geometria pré-ordenada para ganhar desempenho . Portanto, sua câmera só se move para trás ou para frente.
Assim como a concorrência, o PS1 não inclui nenhuma funcionalidade de hardware que resolva o problema de visibilidade. No entanto, a GPU lida com polígonos ordenados fornecendo uma tabela de ordenação: uma tabela dedicada onde cada entrada é indexada usando um valor de profundidade (também chamado de "valor Z") e contém o endereço onde fica o comando da GPU .
A CPU precisa primeiro ordenar manualmente os polígonos e, em seguida, referenciá-los na entrada correta da tabela. Finalmente, a CPU ordena que o DMA envie a tabela para a GPU. Esse processo permite que a GPU renderize a geometria na ordem correta.
O DMA também oferece diversas funções para auxiliar tanto a CPU quanto a GPU na criação e transferência dessa tabela.
Rasterização

Visualização do wireframe da cena.
Uma vez que os comandos são decodificados pela GPU, é hora de converter a geometria recebida (vértices) em píxeis. Isso permite que o sistema aplique o mapeamento de textura, efeitos e, por fim, exiba-os em um painel de duas dimensões (sua TV ou seu monitor). Para fazer isso, a GPU aloca uma matriz de píxeis que é usada como uma área de trabalho, chamada de buffer de imagem. Comparado com o complexo Sega Saturn, a GPU só precisa de um único buffer de imagem.
A GPU usa triângulos como primitivas para formar os modelos 3D. Ao ser a única primitiva disponível, as diferenças entre plano de fundo e elementos em primeiro plano não fazem diferença em termos de composição (ambos são constituídos por triângulos). Jogos em 2D herdam a mesma natureza: eles são apenas dois triângulos unidos para formar um quadrilátero (embora a GPU forneça rotinas para construir sprites automaticamente).
O rasterizador é a unidade responsável por converter vetores em triângulos e, em seguida, em píxeis. Isso é feito por meio de:
- Capturando cada vértice de três pontos e calculando as arestas. Isso forma um triângulo.
- Analisando a área do triângulo para identificar quais píxeis do buffer de imagem eles ocupam. Qualquer seção do triângulo que cobre o ponto de amostragem é convertida em um píxel.
Os píxeis gerados não são escritos imediatamente no buffer de imagem. Em vez disso, eles são enviados para os próximos estágios do pipeline para processamento adicional, que veremos nos parágrafos seguintes.
Shaders
Para aplicar efeitos de iluminação sobre esses polígonos, a GPU fornece dois algoritmos:
- Flat shading: cada primitiva tem um nível de iluminação constante.
- Gouraud shading: cada vértice das primitivas possui seu próprio nível de iluminação. Então, o brilho entre eles é interpolado automaticamente.
- Como você pode imaginar, o resultado é mais realista. Por outro lado, este algoritmo não está disponível para sprites.
A razão para ter essa escolha se resume ao fato de que o flat shading preenche cerca de 2,5 vezes mais polígonos por segundo do que o Gouraud, portanto, é importante otimizar quais polígonos precisam de um sombreamento mais realista do que outros.
Texturas
Finalmente, superfícies sombreadas são mescladas com as texturas (bitmaps 2D) para produzir o resultado final.
A GPU realiza o mapeamento de textura inversa, onde a GPU percorre cada píxel rasterizado e procura o píxel correspondente no mapa de textura (chamado de textel). Os texels são calculados interpolando linearmente o mapa de textura (encontrado na VRAM) para ajustar ao formato do polígono. A rotina usada para a interpolação é chamada de mapeamento de textura afim, essa técnica opera apenas usando coordenadas 2D (valores de X e Y) enquanto descarta a terceira coordenada (Z ou profundidade) usada para perspectiva.
Devido os mapas de textura raramente terem a dimensão exata do polígono rasterizado, os serrilhados (resultados incorretos) podem aparecer. Isso se manifesta com distorções indesejadas, como texels faltantes ou ampliados. Para remediar isso, GPUs sofisticadas empregam filtragem de textura para suavizar (interpolando) mudanças repentinas de cor. Agora, a GPU do PS1 não implementa nenhum filtro, então ele recorre a um algoritmo chamado vizinho mais próximo para corrigir escalas sem suavizar os resultados. Isso é muito rápido (e barato), mas também explica porque os modelos texturizados podem parecer "quadriculados".
A unidade gráfica também inclui os seguintes efeitos disponíveis para uso:
- Semi-Transparency: simula a luz passando por múltiplas texturas.
- Dithering: suaviza mudanças abruptas de cor enquanto mantém a paleta de cores.
Vale ressaltar que o PS1 se destacou na realização desses efeitos!
Etapas restantes
Uma vez finalizado, a GPU escreve os píxeis no buffer de imagem na VRAM, que, por sua vez, são capturados pelo codificador de vídeo e transmitidos para a tela.
Designs
Vamos dar uma pausa agora em toda essa teoria. Aqui estão alguns exemplos de personagens de jogos projetados do zero para a era 3D, eles são interativos, então eu encorajo você a conferi-los!

Modelo interativo disponível na edição moderna
Spyro the Dragon (1998).
413 trângulos.

Modelo interativo disponível na edição moderna
Crash Bandicoot (1996).
732 triângulos.
Brincando com a VRAM
Com a quantidade disponível de VRAM (1 megabyte inteiro), pode-se alocar um enorme buffer de imagem de 1024x512 píxeis com cores de 16 bits ou um realista de 960x512 píxeis com cores de 24 bits — permitindo desenhar os melhores quadros que qualquer jogo já mostrou... Isso parece bastante impressionante, certo? Bem, isso levanta algumas questões, por exemplo:
- Quadros com essas dimensões precisam ser redimensionadas para seguir uma resolução padronizada (ou seja, 480 para NTSC, 576 para PAL) e então o codificador de vídeo pode transmiti-los para TVs comuns.
- Como a GPU vai conseguir desenhar algo decente se não houver espaço sobrando para o resto dos recursos visuais (por exemplo, texturas, tabelas de cores, etc.)?
- A GPU do PS1 só pode desenhar buffers de imagem com até 640x480 píxeis e cores de 16 bpp.
Tudo bem, então vamos ter um buffer de 640x480 com 16 bpp, o que deixa 424 KB de VRAM para recursos visuais. Até agora tudo bem? Novamente, tal resolução pode ser boa em monitores CRT, mas não particularmente notável naquelas TVs dos anos 90 que todo mundo tinha em casa. Então, há alguma maneira de otimizar o buffer de imagem? Apresentando o buffer de imagem ajustável.

Visualização da VRAM no depurador NO$PSX. Você pode ver o buffer de dois quadros de imagem, juntamente com as texturas (que são traduzidas usando uma tabela de cores, também armazenadas ali).
Em essência, em vez de desperdiçar a valiosa VRAM usando resoluções "não apreciadas", a GPU permite diminuir as dimensões do buffer de imagem para aumentar efetivamente o espaço disponível para outros recursos. Em "Gears Episode 2" , Halkun mostra uma configuração que divide o buffer de imagem de 640x480 em dois de 320x480 e, em seguida, confia em uma técnica chamada de page-flipping (alternância de página, em tradução livre) para renderizar várias cenas simultaneamente.
O page-flipping consiste em alternar a localização do quadro para exibição entre os dois disponíveis sempre que o jogo quiser, permitindo que o jogo renderize uma cena enquanto exibe outra. Assim, escondendo qualquer efeito de cintilação e melhorando os tempos de carregamento (algo que certamente o jogador apreciará!).
No geral, o layout de Halkun consome apenas 600 KB de VRAM. O resto (424 KB) pode ser usado para armazenar tabelas de consulta de cores e texturas que, combinadas com 2 KB de cache de textura disponível, resultam em uma configuração muito conveniente e eficiente.
Finalmente, vale mencionar que a VRAM pode ser mapeada usando várias profundidades de cor simultaneamente, o que significa que os programadores podem alocar um buffer de imagem de 16 bpp ao lado de bitmaps de 24 bpp (usados, por exemplo, em quadros de FMV). Essa é outra característica que facilita ainda mais a otimização do espaço.
Segredos e limitações
Embora o PS1 tivesse uma arquitetura muito simples e adequada, surgiram problemas de qualquer maneira. Surpreendentemente, certos probelmas foram resolvidos com soluções inteligentes e engenhosas!
Modelos/texturas distorcidas

Video - Final Fantasy VIII da Square Soft (1999). As texturas tremem um pouco enquanto se movem.
As rotinas usadas para manipulação de geometria e aplicação de textura são conhecidas por apresentar algumas imprecisões.
Em primeiro lugar, o rasterizador só manipula unidades de píxeis: enquanto as coordenadas dos vértices são inteiras, as bordas do triângulo calculadas podem ocupar apenas uma fração do píxel. No entanto, o rasterizador só desenhará o píxel se a área do triângulo cobrir o ponto de amostragem do píxel e não acompanhará a fração ocupada . Isso traz alguns problemas:
- As bordas externas dos modelos saltam abruptamente quando movidas ligeiramente.
- Os triângulos dentro de uma malha (compartilhando os mesmos vértices e arestas) estarão "lutando" para desenhar sobre os mesmos píxeis. Com a tabela de ordenação, a GPU desenhará seguindo uma base de "o último a chegar é o primeiro a ser servido", o que pode levar a interseções de triângulos piscando ou sobrepondo-se quando movidos ligeiramente.
Isso é comumente resolvido implementando a resolução subpíxel, onde o rasterizador acompanha as frações de píxeis ocupados por cada área do triângulo . Consequentemente, métodos de antisserrilhamento podem ser adicionados para suavizar bordas irregulares ou mudanças abruptas na cor.
Além disso, a tabela de ordenação coloca a responsabilidade no desenvolvedor/programador para mostrar a geometria na ordem correta. Em alguns casos, os cálculos implementados dependem de muitas aproximações para ganhar desempenho. Isso pode resultar em superfícies piscando ou ocultas que deveriam ter sido exibidas.
Além disso, definir um buffer de imagem de baixa resolução pode amplificar todos esses problemas de serrilhamento.
Finalmente, como você sabe, as transformações afins não têm noção de profundidade, o que pode confundir a percepção do usuário quando a câmera está próxima do modelo e posicionada perpendicularmente ao espectador . O efeito é referido como distorção de textura. Por isso, alguns jogos recorreram à tesselação (dividindo um polígono grande em polígonos menores) para reduzir a distorção, enquanto outros simplesmente trocaram as texturas por cores sólidas. Em geral, uma GPU resolve esse problema implementando a correção de perspectiva, que interpola as texturas usando o valor de profundidade.
Alegações contraditórias
Se você verificar outros canais técnicos ou fóruns, encontrará explicações alternativas sobre os efeitos de oscilação e distorção do PS1. Embora alguns deles coincidam com o que expliquei anteriormente, outros argumentarão de forma diferente. Portanto, gostaria de dar minha opinião sobre o por que as seguintes declarações não são precisas:
Modelos e texturas oscilam devido à falta de FPU
Um FPU não dita se um computador pode operar ou não com números fracionários. O PS1, como qualquer outro computador sem uma FPU, ainda pode realizar aritmética de ponto fixo. Além disso, usando emulação de software, números de ponto flutuante também podem ser calculados (apenas mais lentamente). Em resumo, as FPUs são apenas aceleradores, não os confunda com uma ALU (a parte crítica de uma CPU que realiza aritmética) ou números decimais.
Modelos e texturas tremem devido ao sistema de coordenadas inteiras da GPU
Usar coordenadas inteiras é uma abordagem comum para tornar os cálculos menos dispendiosos na GPU. É o fato de não usar a resolução de subpíxeis que torna isso em um problema visível. Resumindo, o antisserrilhamento poderia ser aplicado para suavizar mudanças abruptas de cores se o rasterizador contasse a fração do píxel ocupada pelo triângulo.
Texturas sofrem deformação devido à falta de mipmapping (mapa de níveis de detalhe, em tradução livre)
As GPUs que implementam o mapeamento de textura inverso, como esta, estão sujeitas a um erro de medição chamado de "subamostragem" (um píxel é mapeado para vários texels). Isso cria serrilhamentos (resultados incorretos). Esse comportamento é percebido ao renderizar geometrias distantes da câmera. Para remediar isso, os mapeadores modernos de textura aplicam um "filtro trilinear", que suaviza os texels usando a mesma textura armazenada em diferentes escalas (mipmaps) e faz alguma interpolação no meio. Em resumo, o mipmapping é uma abordagem para resolver os serrilhamentos. É o mapeamento de textura afim (com sua falta de correção de perspectiva) que interpola texturas em superfícies de três pontos sem considerar a profundidade. Daí o efeito de "deformação".
Modelos ou texturas tremulam devido à falta de buffer de profundidade
Uma GPU com buffer de profundidade resolve o problema da determinação de superfícies visíveis ao nível de hardware. O PS1 depende de uma tabela de ordenação, o que significa que os desenvolvedores são responsáveis por determinar qual geometria está à frente das outras. Em resumo, qualquer modelo exibindo triângulos tremulantes é causado pelas rotinas de ordenação (software), portanto, é remediado no mesmo software.
Gráficos pré-renderizados

Final Fantasy VIII da Square Soft (1999). Uma cena com plano de fundo pré-renderizado. A maneira como os modelos interagem e se movem é essencial para enganar a percepção do usuário.
Vamos mencionar uma funcionalidade "positiva" para variar...
Se um jogo procurava uma paisagem mais realista do que o que a GPU podia oferecer, uma opção disponível era empilhar dois triângulos e usar o Motion Decoder para reproduzir animação pré-renderizada neles. Vídeos FMV podiam ter um tamanho muito grande, e felizmente o CD-ROM estava preparado para isso.
Alguns jogos contavam especificamente com essa técnica para compor fundos e, honestamente, era bastante convincente vê-los em uma TV CRT, obviamente os emuladores modernos com capacidade de aumento de resolução revelam isso muito facilmente.
Saída de vídeo
A primeira revisão do console apresenta uma quantidade surpreendente de sinais de vídeo com as seguintes portas:
- RFU DC: esta porta foi logo removida, pois era destinava a ser conectada a um modulador RF.
- RCA: fornece vídeo composto.
- S-Video: fornece sinais de luminância + sincronização (combinado) e de cores.
- AV Multi Out: fornece todos os sinais anteriores, exceto RFU, além de sinal RGB e uma linha de +5 volts.
Revisões posteriores do console removeram essas portas e, no final, apenas a porta "AV Multi Out" permaneceu.

