forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   OpenGL, 2D текстуры (http://forum.boolean.name/showthread.php?t=17175)

unself 10.08.2012 22:37

OpenGL, 2D текстуры
 
Вложений: 1
Пишу для себя небольшой raycasting движок по книге Андре ЛаМота. Отрисовку стен делаю не по столбцам, а целыми фрагментаим для каждой отдельной стены. Процедура выглядит примерно следующим образом:
Код:

  //---------------------------------------------------------------------
  glActiveTexture (GL_TEXTURE0);
  glEnable        (GL_TEXTURE_2D);
  //---------------------------------------------------------------------

  //---------------------------------------------------------------------
  // Выбираем предварительно загруженное изображение
  glBindTexture  (GL_TEXTURE_2D, idTextures[0]);
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // GL_CLAMP
  glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); // GL_REPEAT

  // Загрузка текстуры в память видеокарты
  glTexImage2D    (GL_TEXTURE_2D, 0, GL_RGB8, image->width, image->height, 0, image->format, image->internalFormat, (const GLvoid*)image->data);
  //---------------------------------------------------------------------

  glBegin(GL_QUADS);
  for (unsigned int i = 0; i < theCells.size(); i++)
  {
    // Коэффициент подобия
    //---------------------------------------------------------------------
    float leftColumn    = (cell->size * (projPlane->focalLength / theCells[i]->startDistance));
    float topLeft      = (projPlane->height -  leftColumn) * 0.5f;
    float bottomLeft    = topLeft + leftColumn;

    float rightColumn  = (cell->size * (projPlane->focalLength / theCells[i]->endDistance));
    float topRight      = (projPlane->height - rightColumn) * 0.5f;
    float bottomRight  = topRight + rightColumn;
    //---------------------------------------------------------------------

    // GL_QUADS
    //---------------------------------------------------------------------
    glTexCoord2f(theCells[i]->startOffset / (float)cell->size, 0.0f);
    glVertex2i( theCells[i]->startScrX, topLeft    );  // Bottom left
   
    glTexCoord2f(theCells[i]->endOffset / (float)cell->size, 0.0f);
    glVertex2i( theCells[i]->startScrX + (theCells[i]->endScrX - theCells[i]->startScrX), topRight    );
   
    glTexCoord2f(theCells[i]->endOffset / (float)cell->size, 1.0f);
    glVertex2i( theCells[i]->startScrX + (theCells[i]->endScrX - theCells[i]->startScrX), bottomRight );
   
    glTexCoord2f(theCells[i]->startOffset / (float)cell->size, 1.0f);
    glVertex2i( theCells[i]->startScrX, bottomLeft  );
    //---------------------------------------------------------------------
  }
  glEnd();
  glDisable(GL_TEXTURE_2D);

При этом текстуры "плавают" (не знаю как объяснить по другому). Искажение происходит из-за того, что стены рисуются квадратом со сторонами разной высоты. С OpenGL знаком плохо и не представляю, куда копать дальше. Результат хотелось бы получить аналогичный софтверному рендеру.

RegIon 11.08.2012 16:00

Ответ: OpenGL, 2D текстуры
 
ммм,это из-за того, что на кубе одна сторона вниз, а другая вверх типо: ^v^v, и когда ты на нее глядишь- кажеться что плывет.Глазам кажеться

unself 12.08.2012 03:18

Ответ: OpenGL, 2D текстуры
 
Вот, что я имел ввиду:





Первое изображение рисуется попиксельно мною (что хотелось бы видеть в идеале от OpenGL), второе с помощью OpenGL целыми фрагментами каждой отдельной стены. Видимо я поторопился, когда решил, что видеокарта все сделает за меня. Да и подход при отрисовке целыми фрагментами, наверное, я выбрал не правильный. Буду экспериментировать, а там что получится. Извините, если получилась бессмысленная тема, как это часто бывает, понимание к нам приходит после того, как мы уже написали пост на форуме:)

jimon 12.08.2012 13:44

Ответ: OpenGL, 2D текстуры
 
unself
ты чуть не в ту сторону пошел, тебе нужно посчитать и установить матрицы GL_MODELVIEW и GL_PROJECTION, а вершины стен просто задавать в глобальных координатах, математика описана здесь http://www.songho.ca/opengl/gl_transform.html

а то я плохо понимаю как у тебя получается гомогенное деление для перспективы, никто сейчас руками 3д плоскости на экран не проецирует


Часовой пояс GMT +4, время: 02:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot