|
10.08.2012, 22:37
|
#1
|
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 знаком плохо и не представляю, куда копать дальше. Результат хотелось бы получить аналогичный софтверному рендеру.
Последний раз редактировалось unself, 10.08.2012 в 23:58.
|
(Offline)
|
|
11.08.2012, 16:00
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: OpenGL, 2D текстуры
ммм,это из-за того, что на кубе одна сторона вниз, а другая вверх типо: ^v^v, и когда ты на нее глядишь- кажеться что плывет.Глазам кажеться
|
(Offline)
|
|
12.08.2012, 03:18
|
#3
|
AnyKey`щик
Регистрация: 30.12.2011
Сообщений: 12
Написано одно полезное сообщение
|
Ответ: OpenGL, 2D текстуры
Вот, что я имел ввиду:
Первое изображение рисуется попиксельно мною (что хотелось бы видеть в идеале от OpenGL), второе с помощью OpenGL целыми фрагментами каждой отдельной стены. Видимо я поторопился, когда решил, что видеокарта все сделает за меня. Да и подход при отрисовке целыми фрагментами, наверное, я выбрал не правильный. Буду экспериментировать, а там что получится. Извините, если получилась бессмысленная тема, как это часто бывает, понимание к нам приходит после того, как мы уже написали пост на форуме
|
(Offline)
|
|
12.08.2012, 13:44
|
#4
|
|
Ответ: OpenGL, 2D текстуры
unself
ты чуть не в ту сторону пошел, тебе нужно посчитать и установить матрицы GL_MODELVIEW и GL_PROJECTION, а вершины стен просто задавать в глобальных координатах, математика описана здесь http://www.songho.ca/opengl/gl_transform.html
а то я плохо понимаю как у тебя получается гомогенное деление для перспективы, никто сейчас руками 3д плоскости на экран не проецирует
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:37.
|