PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Программирование для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=101)
-   -   GU на PSP (https://www.pspx.ru/forum/showthread.php?t=24500)

pspowner 24.11.2006 14:36

GU на PSP
 
Вложений: 1
Вот, посмотрел доку.

Код:

GU_TRIANGLE_STRIP - Filled triangles-strip (3 vertices for the first primitive, 1 for every following)
Т.е. на 1 полигон - 3 точки, на последующие 1. Попробую переделать.


Да, вот ещё что интересное увидел:

Код:

void sceGuFrontFace  (  int  order  ) 
 
  Set the current face-order (for culling).

This only has effect when culling is enabled (GU_CULL_FACE)

Culling order can be:

GU_CW - Clockwise primitives are not culled
GU_CCW - Counter-clockwise are not culled

Parameters:
 order  - Which order to use

Что это? кто - нить может сказать. Что, как заворачивать примитивы?
Ладно, это сейчас не так важно.
Чайник со СТРИПОМ(cube.zip - для 1.50, кидать в psp/game):

BonifacE 27.11.2006 12:42

Все эти команды аналогичны командам из обычного opengl, любая отрисовка подразумевает что у тебя есть видимые полигоны и невидимые (т.е. те что отрисовываются за видимыми глубже по z буферу) соотвественно enabled (GU_CULL_FACE) включает возможность проверки на отрисовку полигонов, а sceGuFrontFace собственно включает саму проверку на отображение полигонов переднего плана. GU_TRIANGLE_STRIP - соотвественно тоже полностью аналогичен командам opengl. В том примере что ты мне показывал, попробуй заменить GU_TRIANGLE_STRIP (каждый следующий полигон строится по двум предыдущем точкам и одной новой) на GU_TRIANGLES (каждый следующий полигон строится по трем новым точкам)

pspowner 27.11.2006 13:13

Ну немного опоздал ты. Хотя всё равно спс. Вроде въехал.
Двусторонние полигоны я уже просёк как строить, сейчас думаю с чем дальше разбираться...

добавлено через 16 минут
Ага, вот ещё.

Код:

struct Vertex __attribute__((aligned(16))) vertices[4] =
{
    {1, 1, 0xff7f0000,-1,-1,0.0000},
    {1, 1, 0xff7f0000,1,1,0.0000},
    {1, 1, 0xff7f0000,0,0,1},
   
    {1,1, 0xff7f0000, -1,-1,0}
};

Вот вроде нарисовался двусторонний полигон. Крутится так здорово.
Вопрос другой, как я буду, не отрываясь от предыдущего полигона, отрисовывать примитив, например Куб? Или это как в той детской загадке получается: нарисуйти домик, неотрывая ручку от бумаги и не повторяя нарисованных линий?

mushue 27.11.2006 13:45

Простой полигон состоит всего-лишь из трёх вершин.
В твоём примере это треугольник:
{1, 1, 0xff7f0000,-1,-1,0},
{1, 1, 0xff7f0000,1,1,0},
{1, 1, 0xff7f0000,0,0,1},
Чтобы завершить этот полигон и представить его ввиде квадратной плоскости нам нужно добавить обратный треугольник. Тоесть сомкнуть вершины так, что бы из двух полигонов получилась плоскость в виде квадрата.
Последовательность замыкания треугольников значения не имеет.

BonifacE 27.11.2006 13:52

TRIANGLE_STRIP нужен для быстрой отрисовки больших обьемов полигонов, например любой ландшафт можно представить в виде одного стрипа, это сильно экономит видео память так как за место 3 вершин грузиш всего одну. Для мало полигональных моделей это не особо эффективно посему, используется чаще всего просто TRIANGLES. Хотя практически любую модельку можно представить в виде стрипа или набора стрипов (в моделерах есть такая галка).

pspowner 27.11.2006 13:54

Муш, прото что квадрат состоит из двух треугольников - это понятно.
Спрашивал я немонго другое.
Четвёртая точка, в моём случае, делает обратную сторону полигона, если я правильно понял.

Если я добавлю ещё одну точку, то следующий полигон от каких вершин будет строиться?

От последних двух? А если мне надо нарисовать полигон не от этих вершин?
Вот тут и получается что я привязан к последнему нарисованному треугольнику. И если я это не буду учитывать, то на экране будет каша.

И что значит последовательность замыкания? Она всего одна, от последних 2х точек.

Поправьте, если где не прав.

добавлено через 1 минуту
Бони, понятно. Я посмотрю в максе, может есть такая возможность...

mushue 27.11.2006 14:08

Цитата:

Сообщение от pspowner (Сообщение 260707)
Муш, прото что квадрат состоит из двух треугольников - это понятно.
Спрашивал я немонго другое.
Четвёртая точка, в моём случае, делает обратную сторону полигона, если я правильно понял.

Если я добавлю ещё одну точку, то следующий полигон от каких вершин будет строиться?

От последних двух? А если мне надо нарисовать полигон не от этих вершин?
Вот тут и получается что я привязан к последнему нарисованному треугольнику. И если я это не буду учитывать, то на экране будет каша.

И что значит последовательность замыкания? Она всего одна, от последних 2х точек.

Поправьте, если где не прав.

добавлено через 1 минуту
Бони, понятно. Я посмотрю в максе, может есть такая возможность...

Самый простой полигон состоит из 3 вершин. Если ты добавляешь вершину, то ожидать результата можно лишь завершив полигон. Пойми три точки в координатах x,y,z строят тебе твой треугольник. Следующий треугольник соответственно в других координатах. Замыкание - это значит сомкнуть два треугольника хотя бы для того, что бы получить квадратную плоскость.

добавлено через 2 минуты
Возможно в GU можно использовать триангуляцию монотонных полигонов. Это как раз то очем ты говорил "домик не отрывая ручки". Но об этом в GU я не знаю.

pspowner 27.11.2006 16:10

Вложений: 1
Гы, значит кубик нарисовался, всё Ок. НО!
Почемуто некоторые треугольники помаргивают... т.е. Такое ощущение что сквозь них что-то пытается пробиться... Хм...

Посмотрите, если кому не в лом...

BonifacE 27.11.2006 16:25

капитан сорсы с мэйк файлом положи и я гляну...

vAST 27.11.2006 16:27

какое то мерцание

pspowner 27.11.2006 16:33

Вложений: 1
Да собственно это сделано на основе примера из ПСПСДК, только вот в примере всё Ок, а как только я меняю геометрию - всё чёрти как.

pspowner 27.11.2006 18:17

Уффффф.

Фсё... разобрался, кубик рисуется всё без стрипа и без внутренностей - выглядит отлично и не мерцает.

Дело-то было в одной строчке:

sceGuFrontFace(GU_CCW);

С этим уже можно жить...

mushue 27.11.2006 18:52

Цитата:

Сообщение от pspowner (Сообщение 260970)
Уффффф.

Фсё... разобрался, кубик рисуется всё без стрипа и без внутренностей - выглядит отлично и не мерцает.

Дело-то было в одной строчке:

sceGuFrontFace(GU_CCW);

С этим уже можно жить...

Ну слава всевышнему! =)

Очень рад за тебя! Поздравляю. Существенный прорыв!

pspowner 29.11.2006 11:54

Муш не смейся, я ведь только учусь :)

Мысли вслух:
Мне захотелось сделат что-то типа 3д движка. Ну чтобы, например, можнон было ходить вокруг этого кубика, смотреть на него с разных сторон.
Но возникли вопросы, над которыми мне стоит основательно задуматься.

Вот так кубик вращается вокруг своей оси:
Код:

ScePspFVector3 pos = { 0, 0, -2.5f + movez*0.1};
ScePspFVector3 rot = { valx * 0.79f * (GU_PI/180.0f), valy * 0.98f * (GU_PI/180.0f), valz * 1.32f * (GU_PI/180.0f) };
sceGumRotateXYZ(&rot);
sceGumTranslate(&pos);

Как заставить его вращаться вокруг наблюдателя? Вокруг Viewport?
Поскольку я этого никогда не делал, то возникла у меня идея начать смещение кубика по оси х в зависимости от расстояния от него.
Вот как-то так:

Код:

ScePspFVector3 pos = { sin(valy* 0.79f * (GU_PI/180.0f))*(-0.25f+movez*0.1), 0, -2.5f + movez*0.1};
Не знаю, правильно это или нет, но результат есть. Хотя и не совсем такой как ожидалось.

Вобщем, пока в раздумьях я.

К тому же, я наконец-то воткнул в свой компьютер второй гигабайт оперативки и ,О ЧУДО!. Готика 3 стала просто летать - поэтому сейчас часть свободного времени трачу на эту игру. Когда она меня утомит, займусь 3д более плотно.

BonifacE 29.11.2006 12:12

http://www.gamedev.ru/articles/?id=30038 http://www.gamedev.ru/articles/?id=30039
http://pmg.org.ru/nehe/index.html

mushue 29.11.2006 12:36

...

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);

Надеюсь ты понял о чем я?

Ilsor 21.06.2008 07:53

Вложений: 1
Повторю тут вопрос, который уже задавал, но на который никто не ответил.

Есть PSP Slim с 3.90 M33.

Есть вот эта вот программа:
Код:

#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspdisplay.h>
#include <stdlib.h>

#include <pspgu.h>

#ifndef bool
#define bool char
#define true 1
#define false 0
#endif

PSP_MODULE_INFO("SIMPLY GU MODE",0,1,1);

PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

void dump_threadstatus(void);

bool done=false;

int exit_callback(int arg1,int arg2,void *common)
{
 done=true;
 return(0);
}
int CallbackThread(SceSize args, void *argp)
{
 int cbid;
 cbid=sceKernelCreateCallback("Exit Callback",exit_callback,NULL);
 sceKernelRegisterExitCallback(cbid);
 sceKernelSleepThreadCB();
 return(0);
}
int SetupCallbacks(void)
{
 int thid = 0;
 thid=sceKernelCreateThread("update_thread",CallbackThread,0x11,0xFA0,0,0);
 if(thid>=0) sceKernelStartThread(thid, 0, 0);
 return(thid);
}
//начинаем программу
int main(void)
{
 SceCtrlData pad;
 pspDebugScreenInit();
 SetupCallbacks();
 sceCtrlSetSamplingCycle(0);
 sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);

 sceGuInit();

 while(!done)
 {
  sceCtrlReadBufferPositive(&pad, 1);
  //pad.Lx
  //pad.Ly
  if (pad.Buttons!=0) break;
 }
 sceGuTerm();
 sceKernelExitGame();
 return(0);
}

Отлично компилируется, но при запуске на PSP вылетает с ошибкой 8002012С - библиотека не найдена. Это как это так может быть-то?

Настройки IDE вот такие (см. рисунок):

Ilsor 21.06.2008 19:16

Ёшкин кот! Оказывается, вся проблема была исключительно в линкере. Поменял порядок задания библиотек в ключах- сделал так:
Код:

-lpspgum
-lpspgu
-lpspdebug
-lpspdisplay
-lpspctrl
-lpspsdk
-lpsplibc
-lpspnet_inet
-lpspnet_apctl
-lpspnet_resolver
-lpsputility
-lpspuser
-lpspge
-lpspkernel

и всё заработало.
Раньше у меня -lpspgum и -lpspgu шли последними. Интересный прикол...

l3VGV 23.06.2008 11:09

прикол знатный однако. не встречал подобного... по идее то без раницы должнобыть...

Ilsor 23.06.2008 20:31

А никто не знает, что в GU представляют собой матрицы GU_VIEW и GU_MODEL? В OpenGL это одна матрица преобразований локальной системы координат и зовётся она GL_MODELVIEW. А как это тут её умудрились разбить на две? Хм...


Текущее время: 15:38. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.