{"id":21074,"date":"2026-02-09T20:40:01","date_gmt":"2026-02-09T20:40:01","guid":{"rendered":"https:\/\/obewise.com.br\/index.php\/2026\/02\/09\/dev-coloca-shader-3d-em-tempo-real-no-game-boy-color-e-faz-o-classico-bule-brilhar-com-luz-controlada-no-d-pad\/"},"modified":"2026-02-09T20:40:01","modified_gmt":"2026-02-09T20:40:01","slug":"dev-coloca-shader-3d-em-tempo-real-no-game-boy-color-e-faz-o-classico-bule-brilhar-com-luz-controlada-no-d-pad","status":"publish","type":"post","link":"https:\/\/obewise.com.br\/index.php\/2026\/02\/09\/dev-coloca-shader-3d-em-tempo-real-no-game-boy-color-e-faz-o-classico-bule-brilhar-com-luz-controlada-no-d-pad\/","title":{"rendered":"Dev coloca shader 3D em tempo real no Game Boy Color e faz o cl\u00e1ssico bule brilhar com luz controlada no D Pad"},"content":{"rendered":"<p><\/p>\n<div>\n<p>Um desenvolvedor conseguiu algo que parece imposs\u00edvel em um port\u00e1til de 1998. Danny Spencer transformou o Game Boy Color em uma vitrine de sombreamento 3D em tempo real, com um objeto girando na tela e a ilumina\u00e7\u00e3o mudando instantaneamente conforme voc\u00ea mexe no direcional. O resultado \u00e9 um bule estilizado que ganha volume, reflexos e sombras como se estivesse em um ambiente tridimensional de verdade, s\u00f3 que dentro das limita\u00e7\u00f5es extremas do console.<\/p>\n<p>A ideia \u00e9 simples de entender e dif\u00edcil demais de executar. Em vez de apenas trocar sprites e fundos, o demo calcula a intensidade de luz pixel a pixel, usando um shader Lambertian, aquele modelo cl\u00e1ssico em que o brilho depende de qu\u00e3o de frente a superf\u00edcie est\u00e1 para a luz.<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<p>\n<iframe loading=\"lazy\" title=\"Real-time Shader for the Game Boy Color\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/SAQXEW3ePwo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/p>\n<\/figure>\n<h2 class=\"wp-block-heading\">O truque por tr\u00e1s do \u201c3D\u201d no Game Boy Color<\/h2>\n<p>O Game Boy Color tem resolu\u00e7\u00e3o de 160 por 144 pixels e pode exibir dezenas de cores simult\u00e2neas a partir de uma paleta bem maior, mas ainda assim \u00e9 um hardware modesto para fazer matem\u00e1tica pesada.<\/p>\n<p>Para dar conta do sombreamento, Spencer pr\u00e9 calculou informa\u00e7\u00f5es de superf\u00edcie em normal maps, que s\u00e3o mapas usados em 3D para \u201cfingir\u201d detalhes de relevo sem aumentar a complexidade do modelo. Em tempo real, cada pixel consulta um vetor normal e compara isso com a dire\u00e7\u00e3o da luz para decidir o tom que vai aparecer na tela.<\/p>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-01.jpg\" alt=\"\" class=\"wp-image-138371\" srcset=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-01.jpg 1280w, https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-01-768x432.jpg 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\"\/><\/figure>\n<h2 class=\"wp-block-heading\">O maior inimigo era a CPU e a falta de multiplica\u00e7\u00e3o<\/h2>\n<p>A CPU da linha Game Boy pode rodar em modo normal e em modo duplo no Game Boy Color, chegando perto de 8,4 MHz, mas ainda \u00e9 pouco para renderiza\u00e7\u00e3o em tempo real e com um detalhe que complica tudo: n\u00e3o existe instru\u00e7\u00e3o nativa de multiplica\u00e7\u00e3o, o que obriga a buscar atalhos.<\/p>\n<p>\u00c9 a\u00ed que entram as solu\u00e7\u00f5es criativas. A abordagem descrita no projeto usa tabelas de consulta e truques matem\u00e1ticos, como trocar certas multiplica\u00e7\u00f5es por opera\u00e7\u00f5es equivalentes com logaritmos e valores pr\u00e9 calculados, reduzindo o custo de cada pixel renderizado.<\/p>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-02.jpg\" alt=\"\" class=\"wp-image-138372\" srcset=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-02.jpg 1280w, https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-02-768x432.jpg 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\"\/><\/figure>\n<h2 class=\"wp-block-heading\">Otimiza\u00e7\u00e3o no limite para caber em um frame<\/h2>\n<p>Para economizar ainda mais ciclos, a t\u00e9cnica pode converter vetores para coordenadas esf\u00e9ricas e simplificar o c\u00e1lculo do dot product, que \u00e9 o cora\u00e7\u00e3o do sombreamento Lambert. Na pr\u00e1tica, \u00e9 uma sequ\u00eancia de consultas em tabelas e opera\u00e7\u00f5es baratas o suficiente para manter a anima\u00e7\u00e3o responsiva dentro do or\u00e7amento de tempo de cada frame.<\/p>\n<p>Mesmo assim, o port\u00e1til ainda mostra algumas limita\u00e7\u00f5es visuais t\u00edpicas de LCD antigo, como ghosting leve, mas sem quebrar a consist\u00eancia do efeito quando voc\u00ea mexe a luz.<\/p>\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"720\" src=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-03.jpg\" alt=\"\" class=\"wp-image-138373\" srcset=\"https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-03.jpg 1280w, https:\/\/nerdizmo.ig.com.br\/wp-content\/uploads\/2026\/02\/Shader-em-Tempo-real-no-Game-Boy-Color-03-768x432.jpg 768w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\"\/><\/figure>\n<h2 class=\"wp-block-heading\">Como testar o demo e baixar as ROMs<\/h2>\n<p>O c\u00f3digo foi publicado no GitHub no reposit\u00f3rio gbshader. L\u00e1 tamb\u00e9m ficam as releases com as ROMs prontas para rodar em emuladores ou em flashcart, al\u00e9m dos scripts usados para converter os normal maps. O projeto cita o uso do RGBDS como toolchain, com uma vers\u00e3o espec\u00edfica recomendada para compilar.<\/p>\n<p>E tem um detalhe legal: al\u00e9m do download, o demo tamb\u00e9m foi disponibilizado com emula\u00e7\u00e3o via navegador, o que torna a experi\u00eancia bem mais acess\u00edvel para quem s\u00f3 quer ver o bule brilhando e mudar a luz com o teclado.<\/p>\n<h2 class=\"wp-block-heading\">Por que isso importa para a cena retro e homebrew<\/h2>\n<p>Esse tipo de experimento \u00e9 um lembrete de como a criatividade costuma vencer limita\u00e7\u00f5es t\u00e9cnicas. O Game Boy Color n\u00e3o foi feito para gr\u00e1ficos 3D com ilumina\u00e7\u00e3o din\u00e2mica, mas ainda assim d\u00e1 para chegar perto com pr\u00e9 processamento inteligente, tabelas de consulta e otimiza\u00e7\u00e3o agressiva. \u00c9 o tipo de projeto que inspira a comunidade homebrew e, de quebra, vira uma aula pr\u00e1tica de renderiza\u00e7\u00e3o em hardware restrito.<\/p>\n<p>Veja mais sobre games!<\/p>\n<p><h3 class=\"jp-relatedposts-headline\"><em>Relacionado<\/em><\/h3>\n<\/p>\n<p><!-- CONTENT END 1 --><\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Um desenvolvedor conseguiu algo que parece imposs\u00edvel em um port\u00e1til de 1998. Danny Spencer transformou o Game Boy Color em uma vitrine de sombreamento 3D em tempo real, com um objeto girando na tela e a ilumina\u00e7\u00e3o mudando instantaneamente conforme voc\u00ea mexe no direcional. O resultado \u00e9 um bule estilizado que ganha volume, reflexos e &hellip;<\/p>\n","protected":false},"author":1,"featured_media":21075,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_shortscore_rating":"","_shortscore_game":"","_shortscore_summary":"","footnotes":""},"categories":[92],"tags":[4551,7060,10131,43,1037,20,10132,7518,2289,455,10129,1371,10133,794,10130,793],"coauthors":[393],"class_list":["post-21074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-geek","tag-boy","tag-brilhar","tag-bule","tag-classico","tag-coloca","tag-color","tag-controlada","tag-dev","tag-faz","tag-game","tag-game-boy-color","tag-luz","tag-pad","tag-real","tag-shader","tag-tempo"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/posts\/21074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=21074"}],"version-history":[{"count":0,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/posts\/21074\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/media\/21075"}],"wp:attachment":[{"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=21074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=21074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=21074"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/obewise.com.br\/index.php\/wp-json\/wp\/v2\/coauthors?post=21074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}