Войти
ПрограммированиеФорум2D графика и изометрия

тайловый движок на OpenGL - верна ли реализация рендера?

Страницы: 1 2 Следующая »
#0
19:09, 22 июля 2011

в ядре создаю Vertex Array Object
аттачу к нему индекс буфер и вертекс буфер

  glGenBuffers( 1, &vertexBuffer);
  glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer);
  glBufferData( GL_ARRAY_BUFFER, m_vertexSize * g_ui32VertexStride, vertices, GL_STATIC_DRAW );

  glGenBuffers( 1, &indexBuffer);
  glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer );
  glBufferData( GL_ELEMENT_ARRAY_BUFFER, m_IndexSize * sizeof( unsigned short ), indices, GL_STATIC_DRAW );

  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  
  glGenVertexArrays(1, &VAOID);
  glBindVertexArray( VAOID );

  glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer );

  glEnableVertexAttribArray( VERTEX_ARRAY );
  glVertexAttribPointer( VERTEX_ARRAY, 2, GL_FLOAT, GL_FALSE, g_ui32VertexStride, 0 );

  glEnableVertexAttribArray( VERTEXCOLOR_ARRAY );
  glVertexAttribPointer( VERTEXCOLOR_ARRAY, 4, GL_UNSIGNED_BYTE, GL_TRUE, g_ui32VertexStride, (void*) (2 * sizeof(GLfloat) ) );

  glEnableVertexAttribArray( TEXCOORD_ARRAY );
  glVertexAttribPointer( TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, g_ui32VertexStride, (void*) (2 * sizeof(GLfloat) + 4 * sizeof(unsigned char) ) );

  glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer );

затем создаю статический массив для вершин vertices. на 8192 вершины ( шобы с запасом )
все вершины спрайтов которые надо отрисовать копируются в этот массив копирую до тех пор пока на рендер не пойдет спрайт с текстурой отличной от установленной
как только такой спрайт встречается ядро делает "DIP" выводя на рендер все накомпленные вершины - для этого с массива вершин все копируется в VBO он уже потом подается на рендер.

void Render::batch()
{    
  if( m_CurrentVertexIndex <= 0 )
    return;

  m_batch++;

  glBindVertexArray( VAOID );

  glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer);
  
  glBufferSubData( GL_ARRAY_BUFFER, 0,  m_CurrentVertexIndex * g_ui32VertexStride, vertices );
  
  glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer );

  glDrawElements( GL_TRIANGLES, 3 * m_RenderTriangleCount, GL_UNSIGNED_SHORT, (void*)0);

  m_CurrentVertexIndex  = 0;
  m_RenderTriangleCount  = 0;

}

спросите а нафига glBindBuffer( GL_ARRAY_BUFFER, vertexBuffer); и glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, indexBuffer ); - сам не знаю но без них глючит по страшному если рендер с двумя и более VAO происходит.
такое ощущение что индекс буфер не биндится правильный. вобщем рисует правильно только так.

устанавливается новая текстура и цикл повторяется - копируются вершины в массив до тех пор ока не встретится с прайт с текстурой отличной от установленной

такой подход был в HGE и не долго думая применил его у себя в ОГЛ движке.
насколько разумно и где можно заимпрувить производительность?

#1
19:35, 22 июля 2011

progman
> устанавливается новая текстура и цикл повторяется - копируются вершины в массив
> до тех пор ока не встретится с прайт с текстурой отличной от установленной
А если у тебя будут спрайты вот так:
спрайт1:текстура1;
спрайт2:текстура2;
спрайт3:текстура1;
спрайт4:текстура2
?

#2
19:44, 22 июля 2011

StiX
> А если у тебя будут спрайты вот так:
> спрайт1:текстура1;
> спрайт2:текстура2;
> спрайт3:текстура1;
> спрайт4:текстура2

тогда ой... попадос на 4 DIP
сам долго репу чесал как быть и что делать - можно было бы сортировать по текстурам но... но не всегда это реально у меня в игре.
карта изометрическая и объекты на ней правильно рисуется только при определеннм порядке прохода по клеткам и нарушать его ну никак нельзя

#3
21:52, 22 июля 2011

Этоprogman
> но не всегда это реально у меня в игре.
> карта изометрическая и объекты на ней правильно рисуется только при определеннм
> порядке прохода по клеткам и нарушать его ну никак нельзя
Как я понимаю, ты имеешь ввиду слой? Если да, то что мешает тебе добавить слой в спрайт и сортировать по текстурам а потом по слоям?

progman
> затем создаю статический массив для вершин vertices. на 8192 вершины ( шобы с
> запасом )
Имхо, тоже плохое решение. А если ты однажды вылезешь за этот лимит? Или наоборот - у тебя будет постоянно рисоваться мало спрайтов итого ты кучу памяти тратишь впустую...

#4
22:53, 22 июля 2011

progman
я так понимаю принцеп как в HGE? если да то способ нормальный. для 2д двига самое то.

#5
23:48, 22 июля 2011

ret
> progman
> я так понимаю принцеп как в HGE? если да то способ нормальный. для 2д двига
> самое то.
угу 1 в 1 как в HGE рендер организован.

StiX
> Имхо, тоже плохое решение. А если ты однажды вылезешь за этот лимит?
ну тогда я делаю "DIP" и начинаю заполнять массив с начала.

StiX
> Или наоборот - у тебя будет постоянно рисоваться мало спрайтов итого ты кучу
> памяти тратишь впустую...
почему кучу 8192 * sizeof( vertex ) который у меня 20 байт ( по 4 на x y координату, 4 на цвет и по 4 на tu tv)
итого 160 килобайт. не думаю что это куча памяти.

StiX
> Как я понимаю, ты имеешь ввиду слой? Если да, то что мешает тебе добавить слой
> в спрайт и сортировать по текстурам а потом по слоям?

я имею ввиду 2Д карту изометрическую.
там важен порядок обхода.
и если террайн я еще могу рисовать отдельно положив болт на порядок обхода клеток карты и соотв отсортировать могу тайлы по текстурам то что делать со стенами и юнитами...
тут порядок отрисовки важен и нарушать его нельзя.


зы кстати сортировка тайлов граунда дала мне прирост 30% фпс )

#6
23:54, 22 июля 2011

progman
в BufferData при инициализации NULL ставь... зачем там указатели, если ты потом переписываешь
ну и писать можно через MapBuffer, чтобы лишнийц кусок памяти не держать и лишний раз не копировать

#7
0:11, 23 июля 2011

d.m.k
> ну и писать можно через MapBuffer, чтобы лишнийц кусок памяти не держать и
> лишний раз не копировать
примерчик можно?
просто я читал что сразу писать каждую вершину в VB дорого по времени. лучше одним куском туда все слить

#8
15:58, 23 июля 2011

> карта изометрическая и объекты на ней правильно рисуется только при определеннм порядке прохода
А если не отказываться от Z, ведь использование этого буфера практически бесплатно уже многие годы?
Или я тебя не правильно понял? Ты ведь о том что дальние тайлы перекрываются ближними?

..bw

#9
23:09, 23 июля 2011

bw
да. и перекрываются и пересекаются плюс полупрозрачность. так что особого смысла включать zorder не виду

#10
8:46, 25 июля 2011

progman
Вся проблема только из-за полупрозрачных объектов, рисуй все объекты как обычно, а полупрозрачные в последнюю очередь
Вот примерная последовательность отрисовки мира:

2) glDepthMask(GL_TRUE), drawTerrain(), drawSolidObjects() (рисуем ландшафт и не прозрачные объекты)
3) glDepthMask(GL_FALSE), drawAlphaObjects() (рисуем все полупрозрачные объекты)

З.Ы: полупрозрачные полики лучше хранить в отдельном списке, т.к их предется перед отрисовкой сортировать от дальних к ближним к камере

#11
10:34, 25 июля 2011

nes
угу я и сам за такой подход думал.
но пока боюсь - смущают накладные расходы - сортировать каждый кадр спрайты попадающие в камеру
а если не в рендере сортировать то усложняет логику - мониторить все изменения в положении спрайтов и сортировать при изменениях.


разумеется что по жосткому алгоритме бегать по массиву проще но не дешевле.

наверное стоит попробовать.


ЗЫ однако вопрос топика не про порядок отрисовки спрайтов а про реализацию самого рендера на низком ОГЛ уровне )

#12
10:54, 25 июля 2011

progman
Ну так а ты сейчас всю геометрию сортируешь руками (если я конечно правильно понял), это ведь будет дороже по времени по любому.

>ЗЫ однако вопрос топика не про порядок отрисовки спрайтов а про реализацию самого рендера на низком ОГЛ уровне )
А в чем разница?

#13
21:04, 25 июля 2011

nes
> Ну так а ты сейчас всю геометрию сортируешь руками (если я конечно правильно
> понял), это ведь будет дороже по времени по любому.
не сортируются спрайты вообще.

nes
> А в чем разница?
разница в том что вопрос про ОГЛ рендер был задан а не про то как мне спрайты сортировать. я и сам знаю что можно сортировать что можно зет юзать. только это вторично.
первичный вопрос был задан в первом топике. правильно или неправильно организован сам рендер вершин.

#14
23:06, 25 июля 2011

progman
Открою тебе страшную тайну - сортировка спрайтов как раз является частью рендера

>правильно или неправильно организован сам рендер вершин.
Вершины рисуются? Значит правильно сделал

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

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