ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» FAQ по OpenGL | страница 1 |
|
|
|
Канал Игры Мечты: «FAQ по OpenGL» |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Собсно, сабж.
Это вполне нормальное дополнение КИМ.
_________________ MOV topka, C++ |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Итак 1 вопрос - VBO
GL_ARB_vertex_buffer_object - расширение, поддерживаемое всеми современными видеокартами. Позволяет записывать данные об вершинах в память видеокарты, чем ускоряет работу на оочень много. По данным сайта gamedev дает прирост в 1000 раз (!!) на 6800.
http://www.gamedev.ru/terms/VBO
Итак, как вы рисуете объекты. Есть 3 способа.
1) самый медленный
Цитата: |
glBegin(GL_TRIANGLES);
for i:=0 to count-1 do begin
glTexCoord2fv(@Texcoord[i]);
glNormal3fv(@Normal[i]);
glVertex3fv(@Vertex[i]);
end;
glEnd;
|
2)более быстрый
Идея такова - не давать карточке вершини "поштучно", а отправить сразу массивами
Цитата: |
// разрешаем массивы
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
// в элементе массива 2 значения (если у вас 3, то пишите 3)
// GL_FLOAT - тип данных (С++ float, Delphi single)
// 0 - у вас есть отдельно каждый массив, данные идут подрят
// @Texcoord[0]-указатель на первый элемент массива
glTexCoordPointer(2, GL_FLOAT, 0, @Texcoord[0]);
// у нормалей всегда 3 элемента, поэтому нас даже не спрашивают
glNormalPointer(GL_FLOAT, 0, @Normal[0]);
glVertexPointer(3, GL_FLOAT, 0, @Vertex[0]);
// рисование
// GL_TRIANGLES - то же что и в glBegin (GL_TRIANGLES -самый эффективный)
// Есть еще один массив Indx - массив индексов, служит для экономии памяти.
//Например вам нужно вывести вершины 1,2,3, потом 2, 3, 4. Без массива Indx вам нужно будет объявить 2,3 - дважды.
//А с помощью Indx пишите в нем так [1,2,3,2,3,4] и все.
// Count - кол-во элементов в Indx
// GL_UNSIGNED_INT - тип элементов в Indx (в Delphi - cardinal)
// @Indx[0] - указатель на первый элемент массива
glDrawElements(GL_TRIANGLES, Count, GL_UNSIGNED_INT, @Indx[0]);
// ВНИМАНИЕ! Даже если у вас в Indx все идет без повторений, это все равно быстрее, чем без массива Indx
// запрещаем массивы
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
|
Теперь вернемся к VBO.
Идея такова, вместо того чтоб брать данные об массивах с оперативки, нужно брать их из видяхи.
Делается так:
Цитата: |
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[1] );
glNormalPointer( GL_FLOAT, 0, nil );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[2] );
glTexCoordPointer( 2, GL_FLOAT, 0,nil );
glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, VBOpoints[3] );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[0] );
glVertexPointer( 3, GL_FLOAT, 0, nil );
glDrawElements(GL_TRIANGLES, Count, GL_UNSIGNED_INT, nil);
//glVertexPointer - последняя команда перед glDrawElements!! так быстрее
|
Видим появился массив VBOpoints.
Цитата: |
// генерируем 4 имени под 4 массива
glGenBuffersARB( 4, @VBOpoints[0] );
// данные из Vertex (Count*12 --размер)
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[0] );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, Count*12, Vertex, GL_STATIC_DRAW_ARB );
// данные из texcoord (Count*12 --размер)
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[1] );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, Count*12, Normal, GL_STATIC_DRAW_ARB );
// данные из texcoord (Count*8 --размер)
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[2] );
glBufferDataARB( GL_ARRAY_BUFFER_ARB, Count*8, texcoord, GL_STATIC_DRAW_ARB );
// данные из Indx (Count*4 --размер)
glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, VBOpoints[3] );
glBufferDataARB( GL_ELEMENT_ARRAY_BUFFER_ARB, Count*4, Indx, GL_STATIC_DRAW_ARB );
// чистим оперативку
SetLength(vertex,0);
SetLength(normal,0);
SetLength(texcoord,0);
SetLength(indx,0);
|
После завершения работы нужно почистить данные о VBO
Цитата: |
glDeleteBuffersARB(4,@VBOpoints[0]);
|
Теперь рисование такое.
Полный код:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
if JL_USE_VBO then begin
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[1] );
glNormalPointer( GL_FLOAT, 0, nil );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[2] );
glTexCoordPointer( 2, GL_FLOAT, 0,nil );
glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, VBOpoints[3] );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, VBOpoints[0] );
glVertexPointer( 3, GL_FLOAT, 0, nil );
glDrawElements(GL_TRIANGLES, Count, GL_UNSIGNED_INT, nil);
end else begin
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, @Texcoord[0]);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_FLOAT, 0, @Tangent[0]);
glClientActiveTextureARB(GL_TEXTURE2_ARB);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(3, GL_FLOAT, 0, @Binormal[0]);
glNormalPointer(GL_FLOAT, 0, @Normal[0]);
glVertexPointer(3, GL_FLOAT, 0, @Vertex[0]);
glDrawElements(GL_TRIANGLES, Count, GL_UNSIGNED_INT, @Indx[0]);
end;
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE2_ARB);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
_________________ MOV topka, C++ |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Вопрос 2 - lens flares
1)
Код: |
function JEngScene.ZTracePos(Pos):TDotVector3;
begin
var proj_,modl_:T16dArray;
view_:TViewPortArray;
da:single;
px,py,pz,sz,winX,winY:double;
in_vis:boolean;
gluProject ( px, py, pz, modl_, proj_, view_, @winX, @winY, @sz );
glReadPixels ( round(winX), round(winY), 1, 1,GL_DEPTH_COMPONENT, GL_FLOAT, @da );
// in_vis:=(WinX>0)and(WinX<ENG_SCR_X)and
// (WinY>0)and(WinY<ENG_SCR_Y)and(da > sz);
result:=dotVector3(winx,winy,sz);
end;
|
in_vis говорит виден ли источник света в сцене, например не перекрыт ли он какой-то геометрией. Но вызывать его надо после рисования 3Д сцены.
result содержит координаты экранные (px, py, pz - 3Д, а result - 2Д в экране. sz - глубина)
Теперь имея экранные координаты источника lens flares мы рисуем их.
Код: |
FromPos2d:=Scene.ZTracePos(Pos);
p.x:=(ENG_SCR_X-FromPos2d.X*2);
p.y:=(ENG_SCR_Y-FromPos2d.Y*2);
glEnable(GL_TEXTURE_2D);
glDepthMask(0);
for i:=0 to eng_max_Lens-1 do begin
if Lenses[i].Tex<>'' then begin
tex:=Scene.TexBuf.GetItem(Lenses[i].Tex,nil);
glColor4fV(@Lenses[i].Col);
if tex<>nil then tex^.Bind
else begin
Scene.TexBuf.AddFromFile(Lenses[i].Tex);
render;
exit;
end;
v:=dotVector2(FromPos2d.X+(p.x/Lenses[i].posi),
FromPos2d.Y+(p.y/Lenses[i].posi));
DrawBill2D(v,lenses[i].size);
end;
end;
glDepthMask(1);
glDisable(GL_TEXTURE_2D);
|
от части это псевдокод, от части код из моего прошлого движка.
DrawBill2D - рисует в v текстурированый квадрат размером size.
Код: |
procedure DrawBill2D(Pos:TDotVector2;size:double);
const texc:array [0..3] of TDotVector2=((x:0;y:0),(x:1;y:0),(x:0;y:1),(x:1;y:1));
var v:array [0..3] of TDotVector2;
begin
v[0].x:=Pos.x-size;
v[0].y:=Pos.y-size;
v[1].x:=Pos.x+size;
v[1].y:=Pos.y-size;
v[2].x:=Pos.x-size;
v[2].y:=Pos.y+size;
v[3].x:=Pos.x+size;
v[3].y:=Pos.y+size;
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, @v[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, @texc[0]);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
end;
|
_________________ MOV topka, C++ |
|
|
himem
210 EGP
  Репутация: 24 Сообщения: 343 Откуда: Дзержинск- Нижегородский Зарегистрирован: 24.01.2004
 |
|
Ай, малацо! Как обещал, красавчег!
ЗЫ А есть чёньть по облакам/воде? Мона шадеры! Реально облака сделать шарообразными кусками тумана? Наскока быстро буит?
_________________ -Что ты чувствуешь став богатым?
-Опустошенность.
-Да,ты подойдешь для Темного Колеса.Это точно! |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Насчет облаков - не знаю, не было опыта, вообще генерируются шумами Перлина. Можно кучей спрайтов.
Шейдеры - тема. Что хотишь узнать?
_________________ MOV topka, C++ |
|
|
himem
210 EGP
  Репутация: 24 Сообщения: 343 Откуда: Дзержинск- Нижегородский Зарегистрирован: 24.01.2004
 |
|
Про облака видел дему японца какогото - именно шарами/элипсами тумана - тока без исходников и статья - ироглифы! Блин. У меня пока плоские - текстурами 2Д - вроде ничо - но када пересекаешь 10 км высоту - ужасть...
А про шадеры - море - вид сверху/под углом + из под воды + блики на дне - есть реально работаюший кусок?
_________________ -Что ты чувствуешь став богатым?
-Опустошенность.
-Да,ты подойдешь для Темного Колеса.Это точно! |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
himem : |
вид сверху/под углом
|
не понял
просто устанавливаешь туман, шейдеры не надо(разве что пост обработка)
мультитекстурирование. дно+текстура блика(анимированная)
шейдер поможет, разве что с генерацией блика, но ИМХО он хдесь не очень нужен
_________________ MOV topka, C++ |
|
|
himem
210 EGP
  Репутация: 24 Сообщения: 343 Откуда: Дзержинск- Нижегородский Зарегистрирован: 24.01.2004
 |
|
Ага... Р-канал... Попробвам...
Ну а всетаки - можно на лету менять мультитекстуры или по неск раз рендерить?
_________________ -Что ты чувствуешь став богатым?
-Опустошенность.
-Да,ты подойдешь для Темного Колеса.Это точно! |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Да пожалуйса. В одном кадре биндиш одну текстуру на GL_TEXTURE1_ARB, в следующем кадре уже другую.
(ошибка: не по кадрам надо, а по секунам)
_________________ MOV topka, C++ |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
На шейдерах делается следующее
вершинные:
- деформации
- скиннинг
- любое другое изменение вершин
- освещение повершинное
фрагментные:
- текстуринг (в том числе и мультитекстурирование)
- освещение попиксельное
- Фонг
- Блинн
- Любая другая модель освещения
- Бамп маппинг (то над чем я бьюсь третий день)
- искажения (от пламени)
- постобработка (фильтры, например)
АХ,ДА! Совсем забыл!
Для мультитекстурирования нужно еще выставить свойства текстуре.
Код: |
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture0);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Texture1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD); |
http://www.gamedev.ru/articles/?id=20107 - тут все есть.
http://www.gamedev.ru/articles/?id=20002
_________________ MOV topka, C++ |
|
|
Vladimir Kladov
218 EGP
    Репутация: 84 Сообщения: 80 Откуда: Novosibirsk, Russia Зарегистрирован: 11.04.2006
 |
|
Скажите, а как звездное небо (не в смысле НЕБОсклон, а именно сферу со звездами вокруг нас) рисуете? Поделитесь. Попробовал в GL - накидал 20000 звезд на сферу большого радиуса, разбил списки по треугольным секторам, чтобы все сразу не выводить, точками - все замечательно. Но: 1. дрожат, перепрыгивая с пиксела на пиксел, если потихоньку вращать камеру вокгруг любой оси. 2. если включить SMOOTH_POINTS, тоже не очень-то мне понравилось. В первом варианте звезда выглядит звездой, все-таки, а во втором - надо подальше от экрана отодвигаться, чтобы она на звезду была похожа. 3. Пробовал текстуры - но видны даже геометрические искажения отдельных звезд к краю (отвратительно). Плюс некоторые тормоза. А ведь я еще не пробовал сделать туманности... Объясните, какая "техника" должна использоваться, чтобы небо было небом а не декорацией.
|
|
|
Digited
271 EGP
   Рейтинг канала: 4(99) Репутация: 49 Сообщения: 932
Зарегистрирован: 24.08.2004
 |
|
Собственный алгоритм отрисовки поинт-спрайтов, видимо - если не важна какая-либо особенная структура взаиморасположения всех звезд...
Закрашиваете черненьким, а сверху в нужной консистенции разнокалиберными.
В этом плане интересна реализация движения и остановки камеры в IW2 - там большая часть звезд как фильтр при неподвижности камеры. Хотите "живого" - можно как-то так.
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Ну вначале, РЕСПЕКТ за Новосибирку...
Пока я приходил в себя мне в голову взбрели следующие мысли:
Первый вариант - вариант из Homeplanet, самый нормальный, так вот, чтоб звезды не перескакивали им надо увеличить размер.
glPointSize(1.2); ну, например...
Третий, нужно правильно тектурные координаты задавать и делать текстуру у которой по краям черный цвет с значением RGB (0,0,0).
Vladimir Kladov : |
разбил списки по треугольным секторам, чтобы все сразу не выводить
|
Это как? Поясни...
_________________ MOV topka, C++ |
|
|
Vladimir Kladov
218 EGP
    Репутация: 84 Сообщения: 80 Откуда: Novosibirsk, Russia Зарегистрирован: 11.04.2006
 |
|
2Digited: как это не важна. Даже допустим не все небо из реальных звезд, но расположение их обязательно должно быть одинаковым.
2Jurec: glPointSize на моем ноутбуке не катит (сначала думал что у меня в коде что-то не то. Пришел на работу, запускаю экзешник: а там 1. работает SMOOTH 2. Работает glPointSize. Вот вам и инвариантность OpenGL ). Увеличивать размер очень не хочется. HomePlanet запускал. Выглядит там красиво, но звезд мне показалось маловато. (Однажды году в 98 был я на даче в августе и наблюдал около часа ночи настоящее небо. Были видны сразу тысячи звезд, были даже видны туманности, звезды были разноцветные, но все они были безразмерные, т.е. точками, никакими не пятнышками. Я тогда подумал, что примерно так звездное небо должно выглядеть и из космоса). Размер звезд ровно 1 пиксел делает звезду и впрямь очень похожей на звезду (причем неважно, на ЭЛТ или TFT). Яркость лучше регулировать RGB. Возникает проблема с туманностями. Точки-пикселы надо как-то одновременно показывать с текстурными фрагментами, и чтобы при движении камеры не получалось так, что звезды движутся сквозь туманности, при искажениях на краю. Вообще, от искажений на краях лучше было бы как-то вообще отказаться. По крайней мере для звезд. Но не знаю пока как. (т.е. алгоритм мне в голову приходил: бить видимую часть на квадраты, ставить камеру в центр квадрата, рисовать на битмапе в памяти эти звезды - искажение будет минимальное, потом квадрат рисовать по glDrawPixels. Но на этой функции пока обнаружил непреносимые тормоза, не говоря уже о проблемах точного позиционирования в glPixelPos). Может, надо показывать звезды в ортогональной проекции. Но тогда придется софтверно (своим кодом) рассчитывать координаты всех звезд. Может быть есть возможность рисовать в дополнительных буферах карты, и тогда тормоза уйдут. Но не уверен: 1. что это возможно 2. что это будет возможно на всех видеокартах 3. что это уйдет тормоза.
Треугольные сектора - это просто. Приближаю сферу неба треугольниками, камера всегда в центре этой сферы. Для определения того, какие треугольники попали в область видимости, вызываю отрисовку в режиме glRenderingMode( GL_SELECT..., получаю список треугольников. Когда изначально генерится (пока генерится, потом можно загружать) список звезд, для каждой (своим кодом) вычисляется, в какой треугольник она попадает, для треугольника составляется список звезд. (На самом деле, звезду приходится привязывать не к одному треугольнику, а к нескольким, иначе на краях некоторые звезды странным образом появляются не сразу - но это возможно проблема в различии моего алгоритма расчета координат и того, что в GL/видеокарте). Т.е. весь смысл этой канители - сократить список звезд, которые надо просчитывать в кадре, в несколько раз, даже не считать те, что однозначно не попадут на экран - сразу. Могу дать экзешничек на просмотр, всего 30К с хвостиком (Delphi+KOL). Если очень-очень хочется, могу и исходник дать. Он пока что без особого наполнения.
Вообще-то после недели мытарств с OpenGL я решил попробовать отойти на время и посмотреть в сторону D3D. В доках по нему мне очень нравится что уже есть намек на то, как сделать, чтобы было быстрей. Для OpenGL такого нет. Сначала приходится делать код, потом доводить его до рабочего состояние (вспоминая все маты которые знаю), а потом обнаруживать, что это тормозит, и надо делать как-то еще иначе. (Кстати, насчет ARB: у меня видюха XGI, совсем не NVidia - это раз. Хотя и поддержиает шейдеры. VOB'sы точно не покатят. По-моему в соседней ветке затрагивалось, что ARB нужны для хранения массивов в буфере видюхи, так это по-моему и без ARB реализуется, если используются вызываемые списки. Иначе я не представляю, почему количество точек для представления звезд практически никак не влияет на производительность. Пока они списком рендерятся).
Мини-текстурки для звезд это может и неплохо. Пока звед немного. Не знаю (но догадываюсь) какие будут тормоза для сотен (если только для ярких так делать) звезд - в GL.
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Vladimir Kladov : |
glPointSize на моем ноутбуке не катит
|
Тогда рисуй по несколько точек рядом, чтоб они сливались в одну.
Vladimir Kladov : |
Для определения того, какие треугольники попали в область видимости, вызываю отрисовку в режиме glRenderingMode( GL_SELECT..., получаю список треугольников. Когда изначально генерится (пока генерится, потом можно загружать) список звезд, для каждой (своим кодом) вычисляется, в какой треугольник она попадает, для треугольника составляется список звезд.
|
Очень странный вариант...
По моему не нужно проверять такие объекты как звезды на попадание в кадр, это будет намного быстрее. 20000 точек по 1 пикселю - по моему это не нагрузка на систему.
Vladimir Kladov : |
Вообще-то после недели мытарств с OpenGL я решил попробовать отойти на время и посмотреть в сторону D3D
|
Да, у тебя мытарства еще те... Очень прошу, одумайся, Директ это зло.
Vladimir Kladov : |
По-моему в соседней ветке затрагивалось, что ARB нужны для хранения массивов в буфере видюхи, так это по-моему и без ARB реализуется, если используются вызываемые списки. Иначе я не представляю, почему количество точек для представления звезд практически никак не влияет на производительность. Пока они списком рендерятся).
|
Списки нужны, чтоб не повторять вычисления которые уже были сделаны, и списки по-моему хранятся в оперативке, а не в видеопамяти...
Vladimir Kladov : |
Мини-текстурки для звезд это может и неплохо. Пока звед немного. Не знаю (но догадываюсь) какие будут тормоза для сотен (если только для ярких так делать) звезд - в GL.
|
Ну может на ноутбуке и будет, но на обычном компе все буит ОК..
Может скоро смастрячу демку по этому поводу...
_________________ MOV topka, C++ |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
Vladimir Kladov : |
Может, надо показывать звезды в ортогональной проекции. Но тогда придется софтверно (своим кодом) рассчитывать координаты всех звезд.
|
При ортогональной проекции в углах будут искажения другого рода, зрительно даже более неприятные, дело в том, что если вы будете рисовать ортопроекцию фиксированного диаметра, то на краях "поплывут" линейные размеры между звёздами, там надо вытягивать проекцию в эллипс, зависит от FOV
Vladimir Kladov : |
Может быть есть возможность рисовать в дополнительных буферах карты, и тогда тормоза уйдут.
|
P-buffer для звёздного неба можно попробовать, вопрос в том, что для рисовки планет тож было бы неплохо использовать фоновый рендеринг в тот же P-buffer
Vladimir Kladov : |
Мини-текстурки для звезд это может и неплохо. Пока звед немного. Не знаю (но догадываюсь) какие будут тормоза для сотен (если только для ярких так делать) звезд - в GL.
|
Вообще-то скайбокс с текстурками, - самое оно, надо тока решить в какой момент его пересчитывать
_________________ This is what you get ...
(c) Radiohead |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Sh.Tac. : |
P-buffer для звёздного неба можно попробовать, вопрос в том, что для рисовки планет тож было бы неплохо использовать фоновый рендеринг в тот же P-buffer
|
Ого, для такой цели тратиться на Р-буфер... ого, еще раз.
Ну, это явно не на всех картах пойдет.
__
А скайбоксы явно не пойдут, т.к. нужны именно звезды (или я не прав)
_________________ MOV topka, C++ |
|
|
L'osheg
1080 EGP
    Рейтинг канала: 1(6) Репутация: 227 Сообщения: 6068 Предупреждений: 1 Откуда: Texasкие мы... Зарегистрирован: 25.04.2003
 |
|
himem : |
У меня пока плоские - текстурами 2Д - вроде ничо - но када пересекаешь 10 км высоту - ужасть...
|
Намана. Тока надо делать "два слоя" один на ~5-6 км, а второй на ~10-15, нулевой толщины. Пока сквозь облака падаешь оны выглядят как "серое нифига" (т.е. при подходе к высоте облачного слоя опасити в "полный ноль видимости" и "идите по приборам"...)
_________________ Тооолстый тролль с нулевой кривизной дна |
|
|
himem
210 EGP
  Репутация: 24 Сообщения: 343 Откуда: Дзержинск- Нижегородский Зарегистрирован: 24.01.2004
 |
|
Абалдеть! Какие люди тута бывают! Респект за 2 и 3 части! Егопка! (имхо - 75 (50+25) мало )
Поповоду неба - у мя реализовано именно через прстую отрисовку точек... Это ужасно (как выше говорили), на вот как сделано в Celestia - это супер ( не привожу ввиду большого куска - исходники общедоступны http://www.shatters.net/celestia/ ). Вот там действительно реальные звезды. Думаю - это использовать...
кто такой "поповод неба"? 
NRG
_________________ -Что ты чувствуешь став богатым?
-Опустошенность.
-Да,ты подойдешь для Темного Колеса.Это точно! |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Облака - просто набор спрайтов(биллбоардов), стоящих рядом.
_________________ MOV topka, C++ |
|
|
|
|
|
Канал Игры Мечты: «FAQ по OpenGL» |
|
К списку каналов | Наверх страницы |
Цитата не в тему: Хотя, с нашей скоростью постинга в конфу, конец темы ты можешь и не увидеть... (Harley)
|
» FAQ по OpenGL | страница 1 |
|