Показать сообщение отдельно
Старый 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 Кб, 2859 просмотров)

Последний раз редактировалось unself, 10.08.2012 в 23:58.
(Offline)
 
Ответить с цитированием