lookid
> Ты будешь писать?
Ну да. Я люблю тему старых консолей. Сперва это выражалось в том, что у меня было много эмуляторов и я на них много играл в игры старого поколения.
Здесь на форуме это выразилось в разных обзорах старины.
Как программист, однако, я всегда интересовался и внутренним устройством этих девайсов из любопытства.
Это вылилось в практику программирования под Game Boy Advance, включая создание статьи-урока "Реактивное введение в программирование под GBA", что в свою очередь вылилось в проект Contra Force Advance.
Но хотя бы поверхностное знакомство с архитектурами разных 8/16-биток не останавливалось, поэтому появилась предыдущая тема про 8/16-битные системы.
Сейчас вот дошёл до 32-биток по сути. Всё то же самое - читаю в свободное время доки по программированию - их сейчас полно, даже если не официальное SDK, то ребята создававшие эмуляторы всё-равно по косточкам всё расковыряли давно и опубликовали в виде доков. Так что единственное что меня может остановить - это дикая сложность какой либо архитектуры, что про неё будет совсем уж лениво читать и вникать.
Таковой может оказаться та же Sega Saturn - про неё написано немало где, что она была дико сложной для программирования.
=A=L=X=
> Что на PS4 - уже не знаю, но по моим глубоким подозрениям именно после работы с
> сонькой ATI и начала собственную иницативу Mantle, которая ныне вылилась на
> персоналках в Vulkan API.
На рутрекере есть пс4 сдк. Можешь скачать посмотреть что там.
amd.fx6100
> На рутрекере есть пс4 сдк. Можешь скачать посмотреть что там.
Качнул, глянул краем глаза.
Графическое API на соньке называется Gnm и сделано на классах С++. Судя по всему остальное API сделано так же.
Типичный код выглядит вот так:
// Enable z-writes using a less comparison function. Gnm::DepthStencilControl dsc; dsc.init(); dsc.setDepthControl( Gnm::kDepthControlZWriteEnable, Gnm::kCompareFuncLess); dsc.setDepthEnable( true); gfxc.setDepthStencilControl( dsc); // Cull clock-wise backfaces. Gnm::PrimitiveSetup primSetupReg; primSetupReg.init( ); primSetupReg.setCullFace( Gnm::kPrimitiveSetupCullFaceBack); primSetupReg.setFrontFace( Gnm::kPrimitiveSetupFrontFaceCcw); gfxc.setPrimitiveSetup( primSetupReg); // Set up an additive blending mode. Gnm::BlendControl blendControl; blendControl.init( ); blendControl.setBlendEnable( true); blendControl.setColorEquation( Gnm::kBlendMultiplierSrcAlpha, Gnm::kBlendFuncAdd, Gnm::kBlendMultiplierOneMinusSrcAlpha); gfxc.setBlendControl( 0, blendControl); // Set up the output color mask. gfxc.setRenderTargetMask( 0xF);
По современному всё очень многословно и пример вывода пары трианглов вовлекает и шейдеры и стопицот строк инициализации всяких буферов и пайплайн стейджев.
=A=L=X=
> Ну и нелишним будет продемонстрировать уровень графония тех лет и этого железа
> картинкой, лучше так сказать один раз увидеть:
Чем они сортируют полигоны? БСП сами пиляли?
И тени на песке - КАК?!
=A=L=X=
какой-то GAPI работает не так же?
1 frag / 2 deaths
> Чем они сортируют полигоны? БСП сами пиляли?
Сами конечно. Кто как. В то время много было подходов к рендеру, скажем так, ущербноватых, но дающих сильные упрощения.
В том же Crash Bandicoot уровнь чаще всего представлял из себя ленту коридора уходящего вдаль, там наверное даже и BSP не было.
Всякие Лары Крофт вообще весь лабиринт вписывали в кубы - там тоже скорее всего BSP таким образом становился излишен.
Ну и конечно почти всегда всё тонуло в густом тумане, чтобы отсекать лабиринт по дальности, этот наираспространённейший трюк даже стал одним из непременных атрибутов вселенной Silent Hill.
> И тени на песке - КАК?!
"Тени" от стенки слева - просто трианглы по Гуро залиты. Команда 0x34 - gradated textured 3 point polygon.
А тень под персом - это тот самый бит прозрачности. Там возможно 4 формулы на выбор - среднее арифметическое, просто сумма, просто разность и сумма полного сюрфейса с половиной рендерящегося пикселя.
смотрел PS4SDK...много думал... отчего не Mantle ?
Хихихи, почитываю же доку по Nintendo 64, эти перцы там в бородатом году коэффициент "clipping frustrum ratio" назвали в макросах как FRUSTRATIO_1,2,3...6.
=A=L=X=
> Gnm::PrimitiveSetup primSetupReg;
> primSetupReg.init();
Чё прям так? Походу сони не умеет крестокодить.
Panzerschrek[CN]
> Чё прям так? Походу сони не умеет крестокодить.
Да, это больше похоже на Си с классами. Бинарная эффективность во главе, крестопаттерны не в фаворе.
=A=L=X=
> Да, это больше похоже на Си с классами. Бинарная эффективность во главе,
> крестопаттерны не в фаворе.
что не устраивает ?
innuendo
Очевидно тут вспомнили про RAII
=A=L=X=
Это когда пишут врапеперы над вертексэреями и нуляют их на каждый чих прям посреди рисования? окай...
=A=L=X=
> Очевидно тут вспомнили про RAII
покажи GAPI с RAII