GU на PSP
Вложений: 1
Вот, посмотрел доку.
Код:
GU_TRIANGLE_STRIP - Filled triangles-strip (3 vertices for the first primitive, 1 for every following) Да, вот ещё что интересное увидел: Код:
void sceGuFrontFace ( int order ) Ладно, это сейчас не так важно. Чайник со СТРИПОМ(cube.zip - для 1.50, кидать в psp/game): |
Все эти команды аналогичны командам из обычного opengl, любая отрисовка подразумевает что у тебя есть видимые полигоны и невидимые (т.е. те что отрисовываются за видимыми глубже по z буферу) соотвественно enabled (GU_CULL_FACE) включает возможность проверки на отрисовку полигонов, а sceGuFrontFace собственно включает саму проверку на отображение полигонов переднего плана. GU_TRIANGLE_STRIP - соотвественно тоже полностью аналогичен командам opengl. В том примере что ты мне показывал, попробуй заменить GU_TRIANGLE_STRIP (каждый следующий полигон строится по двум предыдущем точкам и одной новой) на GU_TRIANGLES (каждый следующий полигон строится по трем новым точкам)
|
Ну немного опоздал ты. Хотя всё равно спс. Вроде въехал.
Двусторонние полигоны я уже просёк как строить, сейчас думаю с чем дальше разбираться... добавлено через 16 минут Ага, вот ещё. Код:
struct Vertex __attribute__((aligned(16))) vertices[4] = Вопрос другой, как я буду, не отрываясь от предыдущего полигона, отрисовывать примитив, например Куб? Или это как в той детской загадке получается: нарисуйти домик, неотрывая ручку от бумаги и не повторяя нарисованных линий? |
Простой полигон состоит всего-лишь из трёх вершин.
В твоём примере это треугольник: {1, 1, 0xff7f0000,-1,-1,0}, {1, 1, 0xff7f0000,1,1,0}, {1, 1, 0xff7f0000,0,0,1}, Чтобы завершить этот полигон и представить его ввиде квадратной плоскости нам нужно добавить обратный треугольник. Тоесть сомкнуть вершины так, что бы из двух полигонов получилась плоскость в виде квадрата. Последовательность замыкания треугольников значения не имеет. |
TRIANGLE_STRIP нужен для быстрой отрисовки больших обьемов полигонов, например любой ландшафт можно представить в виде одного стрипа, это сильно экономит видео память так как за место 3 вершин грузиш всего одну. Для мало полигональных моделей это не особо эффективно посему, используется чаще всего просто TRIANGLES. Хотя практически любую модельку можно представить в виде стрипа или набора стрипов (в моделерах есть такая галка).
|
Муш, прото что квадрат состоит из двух треугольников - это понятно.
Спрашивал я немонго другое. Четвёртая точка, в моём случае, делает обратную сторону полигона, если я правильно понял. Если я добавлю ещё одну точку, то следующий полигон от каких вершин будет строиться? От последних двух? А если мне надо нарисовать полигон не от этих вершин? Вот тут и получается что я привязан к последнему нарисованному треугольнику. И если я это не буду учитывать, то на экране будет каша. И что значит последовательность замыкания? Она всего одна, от последних 2х точек. Поправьте, если где не прав. добавлено через 1 минуту Бони, понятно. Я посмотрю в максе, может есть такая возможность... |
Цитата:
добавлено через 2 минуты Возможно в GU можно использовать триангуляцию монотонных полигонов. Это как раз то очем ты говорил "домик не отрывая ручки". Но об этом в GU я не знаю. |
Вложений: 1
Гы, значит кубик нарисовался, всё Ок. НО!
Почемуто некоторые треугольники помаргивают... т.е. Такое ощущение что сквозь них что-то пытается пробиться... Хм... Посмотрите, если кому не в лом... |
капитан сорсы с мэйк файлом положи и я гляну...
|
какое то мерцание
|
Вложений: 1
Да собственно это сделано на основе примера из ПСПСДК, только вот в примере всё Ок, а как только я меняю геометрию - всё чёрти как.
|
Уффффф.
Фсё... разобрался, кубик рисуется всё без стрипа и без внутренностей - выглядит отлично и не мерцает. Дело-то было в одной строчке: sceGuFrontFace(GU_CCW); С этим уже можно жить... |
Цитата:
Очень рад за тебя! Поздравляю. Существенный прорыв! |
Муш не смейся, я ведь только учусь :)
Мысли вслух: Мне захотелось сделат что-то типа 3д движка. Ну чтобы, например, можнон было ходить вокруг этого кубика, смотреть на него с разных сторон. Но возникли вопросы, над которыми мне стоит основательно задуматься. Вот так кубик вращается вокруг своей оси: Код:
ScePspFVector3 pos = { 0, 0, -2.5f + movez*0.1}; Поскольку я этого никогда не делал, то возникла у меня идея начать смещение кубика по оси х в зависимости от расстояния от него. Вот как-то так: Код:
ScePspFVector3 pos = { sin(valy* 0.79f * (GU_PI/180.0f))*(-0.25f+movez*0.1), 0, -2.5f + movez*0.1}; Вобщем, пока в раздумьях я. К тому же, я наконец-то воткнул в свой компьютер второй гигабайт оперативки и ,О ЧУДО!. Готика 3 стала просто летать - поэтому сейчас часть свободного времени трачу на эту игру. Когда она меня утомит, займусь 3д более плотно. |
|
...
ScePspFMatrix4 projection; ScePspFMatrix4 view; Проекция по желанию gumLoadIdentity(&projection); gumPerspective(&projection,75.0f,16.0f/9.0f,0.5f,1000.0f); Вот тут самое интересное: { ScePspFVector3 pos = {0,0,-5.0f}; gumLoadIdentity(&view); gumTranslate(&view,&pos); } Вот тут еще интереснее =) sceGuSetMatrix(GU_PROJECTION,&projection); sceGuSetMatrix(GU_VIEW,&view); Надеюсь ты понял о чем я? |
Вложений: 1
Повторю тут вопрос, который уже задавал, но на который никто не ответил.
Есть PSP Slim с 3.90 M33. Есть вот эта вот программа: Код:
#include <pspkernel.h> Настройки IDE вот такие (см. рисунок): |
Ёшкин кот! Оказывается, вся проблема была исключительно в линкере. Поменял порядок задания библиотек в ключах- сделал так:
Код:
-lpspgum Раньше у меня -lpspgum и -lpspgu шли последними. Интересный прикол... |
прикол знатный однако. не встречал подобного... по идее то без раницы должнобыть...
|
А никто не знает, что в GU представляют собой матрицы GU_VIEW и GU_MODEL? В OpenGL это одна матрица преобразований локальной системы координат и зовётся она GL_MODELVIEW. А как это тут её умудрились разбить на две? Хм...
|
Цитата:
P.S. Раздел начал активно двигаЦЦо! |
с огл щас тока разбираюсь. но по идее сони от него не могло уйти далеко... может модель это матрица типа установки вида проектирования в огл?
|
И ещё вопрос тогда. Вот простейшее GU-приложение:
Код:
#include <pspkernel.h> 1) Как я понял, работает GU всегда на основе дисплейных списков (как в OpenGL). И для списка нужно явно указывать доступный объём памяти да ещё и с выравниванием по параграфу. Почему-то все задают размер 262144 - это почему так? И вообще, сколько на борту видеопамяти? 2) Почему буфер глубины 16-ти битный? Точность же пострадает... 3) Какой смысл в виртуальном экране 4096x4096, если отображать можно 480x272 максимум и при этом переключать страницы sceGuSwapBuffers(). Зачем же тогда такой экран? Хм... Какой в нём смысл? Единственно, реализовывать полноэкранное сглаживание можно используя полный 4096x4096, но примимо ли это на PSP? 4) Нулевой байт цвета - это альфа-канал? 5) Почему примитивы можно создавать либо глобально в программе, либо распределяя память дисплейного списка командой float __attribute__((aligned(16))) *vertex=(float*)sceGuGetMemory(9*sizeof(float)), но нельзя выделить память типа float vertex[9]. У меня последний вариант не работает никак. 6) Зачем придумано обрезание порта просмотра командами sceGuScissor(0,0,480,272); sceGuEnable(GU_SCISSOR_TEST); 7) Для чего нужна команда sceGuDisplay(GU_TRUE); Не понимаю логики. Зачем включать то, что уже включено? Хм... Вот такие вот пироги... я хорошо знаком с OpenGL, но вот GU меня местами удивляет неимоверно. :) |
Вложений: 1
Цитата:
|
Ээээ. мастер ты это. мыж тут нубы :)а ты к нам будто мы соневские доки читали и знаем...
видеопамяти на борту 2 метра афайк. |
Жалко... придётся выяснять опытным путём... Увы, в русском сегменте инета никакой вразумительной информации я не нашёл. А с английским у меня некоторые трудности - я немецкий учил, а английский исключительно "опытным путём". :) Ну ничего, эксперименты покажут, что вся эта тарабарщина из себя представляет. :)
добавлено через 4 часа 17 минут 1) Однако, оказывается, что альфа-канал в цвете идёт первым, а вот дальше идут уже b g и r. 2) Инициализацию локальных и глобальных массивов вершин примитивов можно делать только до sceGuInit. После sceGuInit инициализацию можно делать только через выделенный дисплею блок памяти, через sceGuGetMemory. 3) Чтобы каждую точку примитива раскрасить в свой цвет или чтобы назначить ей точку текстуры,нормали и т.д. нужно объединять флаги команды sceGumDrawArray, например, sceGumDrawArray(GU_TRIANGLES,GU_COLOR_8888|GU_VERTEX_32BITF|GU_TRANSFORM_3D,3,0, sVertex); Ну а с остальным пока экспериментирую... |
Вложений: 1
Вот что ещё выяснил:
1) При задании текстур данные идут как RGBA (т.е. порядок не такой, как при задании цвета! в sceGuColor) 2) Если синхронизацию по sceDisplayWaitVblankStart() ставить после sceGuSwapBuffers(), то вверху экрана будет полоса, где вывод производиться не будет - отстаём от развёртки? :) 3) Ширина и высота текстуры должны быть степенью 2 и ширина должна быть выровнена по параграфу (16 байт). Вот код моей библиотеки для работы со спрайтами с использованием GU: Код:
#ifndef CSPRITE_H_INCLUDED |
А какой смысл в пикселе интресно порядок менять?
|
Хороший вопрос... Наверное, из целей совместимости с OpenGL. А вообще, картинки всякие (TGA и BMP и другие) тоже порядок цветов меняют. Я уже и не помню, зачем им это надо было... Но вообще, это не очень удобно лично мне. :)
добавлено через 1 минуту Ах да, я сказал несколько неоднозначно: "Однако, оказывается, что альфа-канал в цвете идёт первым, а вот дальше идут уже b g и r. " Т.е. раскладка битовая такая: abgr. А для текстуры или спрайта раскладка: rgba |
может во время какихто прередач(внутре конвеера или из памяти в гу...) удобно чтобы байты задом наперёд шли...хых. мистика :)
однако ценное наблюдение. спасибо. |
Да нет, вроде конвейеру-то как раз всё равно... Может, там для прямого вывода загруженных картинок сделано? То есть, читаем, скажем, bmp и тут же выводим простым копированием в видеопамять. Хотя вряд ли. Надо поискать смысл инверсии порядка цветов.
|
Отправил GU текстурку 480x272 по-моему, а по его представлениям 512x512. Ну что можно сказать... либо я что-то сделал не так, либо он с такими размерами не работает. Экран мерцает, по нему идут полосы, хотя на заднем фоне текстуру видно. Увеличивал размер памяти дисплейного списка - не помогло. А с маленькими 64x64 без проблем всё идёт. Наверное, 512 для него слишком жирно...
|
Вложений: 1
А вот GU-приложение "пасьянс косынка". Пока - прототип. То есть, играть можно (аналоговый джойстик и кнопка "крестик"). Это на нём текстуру зелёного сукна вместо 480x272 мне пришлось заменить маленький кусочек. :)
|
Занятно. Попытался вывести несколько раз относительно крупный спрайт (256x64). Опять глюки. Экран мерцает, картинка разваливается. Причём, один спрайт выводится. Два - уже нет. Такое впечатление, что Gu массив данных спрайта зачем-то перекидывает в память списка и заданных 256 кБ не хватает. Но если выделить в 10 раз больше, тоже работать не начинает. Если выводить один спрайт в одном дисплейном списке, а второй во втором, то тоже ничего не выходит, либо я чего-то не так делаю.
Вот сейчас сделал спрайты 128x64 и выделил под список 512 кБ. Пока работает. Интересно, если я ещё спрайтов добавлю, оно продолжит работать... хм.. |
А всё-таки непонятно, как же выглядит адресное пространство PSP. Я попытался снять скриншот в моём пасьянсе копированием области, заданной GU как видеобуфер (т.е. начинающейся с 0 (!) - обычно-то для графических приложений не для GU задавался адрес 64 мБ)
Код:
<...> |
Даю справку. по адресам:
http://wiki.ps2dev.org/psp:memory_map Надеюсь это то. на слимке чутка отличается но не критично. чуть пошире куски основной памяти и безкешевой области. думаю начинать копировать с 0 бесполезно, для неё это ркивой указатель и она сразу его в топку. АФАЙК начинать надо с 64Кб. Также советую заглянуть в папку с семплами, там был пример как гулять по памяти, делать карту и как дампить всякое разное. |
Цитата:
|
Вопрос без официальных доков имхо не отвечаем :) те как факт мы это знаем. а вот почему? ну хз. так уж сделано.
|
А ещё никто у Sony оригинальный SKD не спиратил? :)
|
Пока нет :( по крайней мере в торентах не ищутся.
|
Текущее время: 20:09. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.