Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 10.08.2012, 22:37   #1
unself
AnyKey`щик
 
Регистрация: 30.12.2011
Сообщений: 12
Написано одно полезное сообщение
OpenGL, 2D текстуры

Пишу для себя небольшой 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 знаком плохо и не представляю, куда копать дальше. Результат хотелось бы получить аналогичный софтверному рендеру.
Вложения
Тип файла: zip Raycasting.zip (260.5 Кб, 434 просмотров)

Последний раз редактировалось unself, 10.08.2012 в 23:58.
(Offline)
 
Ответить с цитированием
Старый 11.08.2012, 16:00   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: OpenGL, 2D текстуры

ммм,это из-за того, что на кубе одна сторона вниз, а другая вверх типо: ^v^v, и когда ты на нее глядишь- кажеться что плывет.Глазам кажеться
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 12.08.2012, 03:18   #3
unself
AnyKey`щик
 
Регистрация: 30.12.2011
Сообщений: 12
Написано одно полезное сообщение
Ответ: OpenGL, 2D текстуры

Вот, что я имел ввиду:





Первое изображение рисуется попиксельно мною (что хотелось бы видеть в идеале от OpenGL), второе с помощью OpenGL целыми фрагментами каждой отдельной стены. Видимо я поторопился, когда решил, что видеокарта все сделает за меня. Да и подход при отрисовке целыми фрагментами, наверное, я выбрал не правильный. Буду экспериментировать, а там что получится. Извините, если получилась бессмысленная тема, как это часто бывает, понимание к нам приходит после того, как мы уже написали пост на форуме
(Offline)
 
Ответить с цитированием
Старый 12.08.2012, 13:44   #4
jimon
 
Сообщений: n/a
Ответ: OpenGL, 2D текстуры

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

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com