Войти
ПрограммированиеФорумГрафика

Разный порядок отрисовки квадратов

Страницы: 1 2 Следующая »
#0
9:24, 1 авг. 2015

Проблема в следующем: с помощью glBegin (GL_QUADS); рисую землю и деревья, НО, на разных видеокартах/компах квадраты рисуются по разному - на одних линия раздела слева сверху направо вниз, а на других слева снизу направо вверх. Из-за этого например при расчете высоты на поверхности земли надо использовать разные формулы. А деревья вообще рисуются криво, плоские вместо объемных. В общем от этого куча проблем.

Вопрос: Как определить порядок отрисовки квадратов или задать порядок в ручную?

Пояснение: рисовать треугольниками не хочу, т.к. заметно падает скорость, даже с учетом вывода листами.


#1
9:28, 1 авг. 2015

ahx666
> Как определить порядок отрисовки квадратов или задать порядок в ручную?
Никак. Не существует никакого порядка - только если отдельными вызовами glBegin.

#2
11:34, 1 авг. 2015
glBegin
и
рисовать треугольниками не хочу, т.к. заметно падает скорость, даже с учетом вывода листами

Оно и не удивительно ;)
#3
12:09, 1 авг. 2015

sevg
И? Если есть предложения или знаешь как лучше - делись)

#4
13:08, 1 авг. 2015

ahx666
> И? Если есть предложения или знаешь как лучше - делись)
glDrawArrays или glDrawElements

#5
17:24, 1 авг. 2015

ahx666
>на одних линия раздела слева сверху направо вниз, а на других слева снизу направо вверх. Из-за этого например при расчете высоты на поверхности земли надо использовать разные формулы.
И как это может влиять на рассчеты высоты?

#6
21:14, 3 авг. 2015

nes

И как это может влиять на рассчеты высоты?

В зависимости от линии раздела квадрата треугольники рисуются по разному, соответственно и рельеф получается разный. Например все точки квадрата кроме 1,1 имеют высоту 0, а 1,1 высоту 1, тогда при линии раздела от 0,0 к 1,1 высота в центре будет 0.5, а при линии раздела от 1,0 к 0,1 высота в центре будет 0.

-Eugene-
Провел несколько тестов на разных машинах, которые попались под руку. Результаты следующие: Вывод с помощью glDrawArrays дает ощутимый прирост производительности только на машинах без видеокарты, но с мощным процессором. На машинах с любой видеокартой glDrawArrays работает с той же скоростью, что и вывод через glCallList с одним вызовом glBegin(GL_QUADS) или glBegin(GL_TRIANGLES) на все примитивы. Да, в любом случае рисование по квадратам быстрее чем по треугольникам, что glDrawArrays, что glCallList.

ну и немного кода, может я чего криво сделал) надеюсь на понимание)

1) создаем массивы для вывода (wi и he - ширина и высота карты)

Vertex3: Array [0 .. (6 * wi * he) - 1] of TPoint3f;     // для треугольников
    Colors3: Array [0 .. (6 * wi * he) - 1] of TColor4f;
    TexCoord3: Array [0 .. (6 * wi * he) - 1] of TPoint2f;

for j := 0 to he - 1 do
    for i := 0 to wi - 1 do
      for k := 0 to 5 do // 2 треугольника    - 6 точек
      begin
        n := k + ((j * he) + i) * 6;
        Vertex3[n].X := IfThen(k in [0,3,5], 0+i, 1+i);
        Vertex3[n].Y := IfThen(k in [0,2,3], 0+j, 1+j);
        Vertex3[n].Z := 0;
          Colors3[n].r := 1;
          Colors3[n].g := 1;
          Colors3[n].b := 1;
          Colors3[n].a := 1;
        TexCoord3[n].X := IfThen(k in [0,3,5], 0, 1);
        TexCoord3[n].Y := IfThen(k in [0,2,3], 0, 1);
      end;

2) выводим

glVertexPointer(3, GL_FLOAT, 0, @Vertex3);
    glColorPointer(4, GL_FLOAT, 0, @Colors3);
    glTexCoordPointer(2, GL_FLOAT, 0, @TexCoord3);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glDrawArrays(GL_TRIANGLES, 0, 6 * wi * he);

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

а теперь вывод списков
1) создаем список (для простоты создал его из уже готовых массивов, в игре придется делать наоборот)

glNewList(lst3, GL_COMPILE);
  glBegin(GL_TRIANGLES);
    for j := 0 to he - 1 do
      for i := 0 to wi - 1 do
        for k := 0 to 5 do
        begin
          n := ((j * he) + i) * 6;

          glColor4f(Colors3[k + n].r, Colors3[k + n].g, Colors3[k + n].b, Colors3[k + n].a);
          glTexCoord2f(TexCoord3[k + n].X, TexCoord3[k + n].Y);
          glVertex3f(Vertex3[k + n].X, Vertex3[k + n].Y, Vertex3[k + n].Z);

        end;
  glEnd;
glEndList();

2) ну и выводим это хозяйство

  glCallList(lst3);


Конструктивная критика и предложения приветствуются, вдруг кому еще поможет)

#7
21:20, 3 авг. 2015

ahx666
> glDrawArrays работает с той же скоростью, что и вывод через glCallList
А, ну листы все сильно меняют. В общем, если тебе нужен порядок, определяй его с помощью глубины примитивов.

#8
22:22, 3 авг. 2015

ahx666
> Да, в любом случае рисование по квадратам быстрее чем по треугольникам, что
> glDrawArrays
Но не быстрее чем glDrawElements

> 1) создаем массивы для вывода (wi и he - ширина и высота карты)
Оу, так ты еще и не interleaved вершины делаешь, понятно почему не быстрее.

#9
22:27, 3 авг. 2015

Вот почитай короче тут: https://developer.apple.com/library/ios/documentation/3DDrawing/C… rtexData.html

#10
22:28, 3 авг. 2015

-Eugene-

В общем, если тебе нужен порядок, определяй его с помощью глубины примитивов.

Можно по подробнее, или ссылочку?
Порядок отрисовки ведь зависит от машины, не совсем понимаю какая связь...

да, дабы избежать недопонимания: под порядком отрисовки я подразумеваю способ деления квадрата на треугольники при отображении.

Да, еще заметил такую странность - на некоторых видеокартах при отрисовке квадратами на таком расстоянии, что часть примитива уходит за камеру, квадрат самопроизвольно меняет порядок отрисовки, а иногда вообще неизвестным образом деформируется(!). Я даже не знаю как объяснить... Короче начинает жить своей жизнью. Особенно интересно когда он начинает мигать, т.е. каждый такт меняет порядок отрисовки. Причем на старых компах (5-6 лет) этого прикола нет, заметил только на новых (менее 3-ех лет). Это можно как-то лечить?

#11
23:06, 3 авг. 2015

ahx666
> да, дабы избежать недопонимания: под порядком отрисовки я подразумеваю способ
> деления квадрата на треугольники при отображении
Какая разница, как делится квадрат на треугольники? Не вижу ни одного случая, когда бы это могло иметь значение.

Короче, проблема XY. Скажи, что ты делаешь, и мы объясним тебе, почему ты не прав.

#12
23:29, 3 авг. 2015

-Eugene-
> Не вижу ни одного случая, когда бы это могло иметь значение.
Когда 4 вершины квадрата не лежат в одной плоскости например.

#13
2:28, 4 авг. 2015

ahx666
Порядок отрисовки - индексы. Квадратами никто не рисует уже лет 10.

#14
8:08, 4 авг. 2015

Машины без видеокарты - это как?

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

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