Войти
OpenGL communityФорумВопросы по программированию

OpenGL 1.1 Меньше draw call'ов или трансформация вершин на видеокарте?

Страницы: 1 2 Следующая »
#0
7:47, 18 авг. 2013

Привет.

Подскажите, пожалуйста, дилетанту)

Все объекты с общим материалом (текстура + параметры блендинга) собираются в один буффер(массив) вершин и выводятся:

glDrawElements(GL_TRIANGLES, indexBufferOffset, GL_UNSIGNED_SHORT, meshBuffer.indices);

При этом, естесвенно, трансформация вершин происходит на ЦПУ. Всё хорошо, так как 95% всех объектов - это спрайты с четырьмя вершинами, для трансформации которых не ипользуются матрицы, просто умножаются на scale и прибавляются pos, вращение только вокруг оси z:

float sinRot = sinf(a);
float cosRot = cosf(a);
float x, y;
for(int i = 0; i < 4; ++i)
{
  x = quad.vertices[i].x;
  y = quad.vertices[i].y;
  quad.vertices[i].x = x * cosRot - y * sinRot + transform.position.x;
  quad.vertices[i].y = x * sinRot + y * cosRot + transform.position.y;      
}

Но кроме этого будет небольшое количество несложных 3d моделек.

Тут уже будет кватернион для вращения и без матриц не обойтись. И вот вопрос.

Как лучше сделать - всё так же софтверно умножать каждую вершину модельки на матриуцу, после чего собирая все модельки в один фуффер, чтобы за минимальное количество вызовов glDrawElements() нарисовать их  или лучше собирать матрицу трансформации и передавать OpenGL, тогда на каждую 3d модель будет вызов:

glLoadMatrixf(obj[i]->matrix);
glDrawElements(GL_TRIANGLES, indexBufferOffset, GL_UNSIGNED_SHORT, meshBuffer.indices);

?

Может есть какой-нибудь буффер матриц?))


#1
20:21, 18 авг. 2013

Если ещё добавить скелетную анимацию для мешей, то вроде возможности OpenGL 1.1 не оставляют ничего другого кроме как программной обработки вершин, умножение матриц и умножение всех вершин на матрицы...
Буду думать чтобы отказаться от использования 3d  моделек и всё делать через спрайты. Хотя если взять вариант использовать не скелетную анимацию, а по-кадровую для мешей, как Кармак в одном из Квейков.
Дайте совет, пожалуйста.

Update:
попробывал на тестовой модельке с текстурой 1024x1024, (вершин 994, треугольников 1376, индексов 4128) загружать матрицу glLoadMatrix перед её выводом - загрузка проца такая же как при "ручном" умножении вершин. OpegGl программно  чтоли умножает вершины на матрицу?

В общем, если никто не поправит - буду делать всё как делал, собирать все модели в один буфер, программно умножая вершины. Просто модельки будут совсем простые, не такие тяжелые как эта тестовая.

#2
22:05, 18 авг. 2013

Riddik
> OpegGl программно  чтоли умножает вершины на матрицу?
да,хотя все зависит от реализации где FFP может эмулироватьcя шейдером.

#3
22:34, 18 авг. 2013

Riddik
> glDrawElements(GL_TRIANGLES, indexBufferOffset, GL_UNSIGNED_SHORT,
> meshBuffer.indices);

Надо думать нету VBO ?

#4
22:39, 18 авг. 2013

Opengl 1.1

#5
22:40, 18 авг. 2013

Данич
> Opengl 1.1

Кто мешает подключить VBO хоть на 1.1 ?

#6
12:03, 19 авг. 2013

innuendo
> Кто мешает подключить VBO хоть на 1.1 ?
Я спрашивал о целесообразности этого, вроде как смысла в моём случае нет, так как я всё равно каждый кадр собираю общий буфер вершин: http://www.gamedev.ru/community/ogl/forum/?id=179256

Хотя если использовать меш-фреймовую анимацию как в кваке-2, и загрузить все меши в VBO, то может и будт профит хоть для 3d моделек. Для спрайтов однозначто VBO ничего не даст.

#7
1:37, 20 авг. 2013

Ничего дурного нет для производительности в том, чтобы вызывать  каждый кадр нексколько раз ф-ии glEnable/glDisable?
if(rs.z_buffer) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
if(rs.cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);

#8
18:55, 20 авг. 2013

innuendo
>> Opengl 1.1
>Кто мешает подключить VBO хоть на 1.1 ?

Спецификация.

Wikipedia :

Спецификация Vertex Buffer Object была стандартизирована OpenGL Architecture Review Board как OpenGL версии 1.5 (в 2003).
#9
10:32, 21 авг. 2013

Данич

Это официально ... если получишь адрес функции расширения то можно на какой хочешь :)

Я сильно сомневаюсь, что топикасте работает на реальной v 1.1 ...

#10
13:37, 21 авг. 2013

innuendo
> Я сильно сомневаюсь, что топикасте работает на реальной v 1.1 ...

На 1.1, без расширений вообще. Ибо казуалка. Почти все на Direct3d 9 делают казуалки, я пробую на OpenGL 1.1. После внедрения всех фич если будет тормозить на целевом железе, то перепишу на d3d 9

#11
3:43, 22 авг. 2013

Можешь смело брать 2.1, т.к. сейчас любая карта, даже десятилетней давности, держит его, но он не будет работать без дров, хотя и это не проблема, ведь директ без дров эмулируется софтварно, то всё будет глючить(проверено на вин7 и пасьянсе пауке) и юзверь найдёр способ поставить драйвер.

#12
13:22, 22 авг. 2013

Данич
Учту, спасибо)

#13
22:07, 22 авг. 2013

Сейчас делаем игру, использовали SFML (контекст 2.0), не прошли QA у биг фишей, переписали на директ.
Проблемы с которыми встретились :
1. Скринсейвер не хотел грузить DXT текстуры (хотя в режиме игры все было замечательно).
2. Некоторые современные видео карты (интелы на ноутбуках) не могли загрузить весь нужный контент (хотя там работает старкрафт 2й на средних и в видео память грузит больше ресурсов).
3. Некоторые старые видео карты больше не поддерживаются (начиная с вин7 нету официальных драйверов), а иногда наоборот на вин7 все отлично, на ХР плохо (не рисовались рендер таргеты).
4. Слабая производительность на каких то Нвидиях (возможно просто дрова не стояли, на какой то даже не запустилось).
5. На некоторых картах приложение вылетало когда удалялась текстура.

Возможно все эти проблемы из-за кривых рук разработчиков SFML (использовали исключительно доступный через него функционал), но мы решили сделать порт необходимого функционала на direct3d и проблемы исчезли.

#14
1:26, 23 авг. 2013

Mikey
Интересная заметка, благодарю.

Страницы: 1 2 Следующая »
OpenGL communityФорумВопросы по программированию

Тема в архиве.