Текстурирование VBO (объектов буфера вершин) - PullRequest
0 голосов
/ 07 ноября 2010

В настоящее время я работаю над процедурным инструментом генерации планет, который работает, беря куб, отображая его в сферу и затем применяя карту высот к каждому лицу для создания ландшафта.

Я использую VBOдля каждого лица, созданного с использованием следующего метода:

void Planet::setVertexBufferObject()
{
 Vertex* vertices;
 int currentVertex;
 Vertex* vertex;

 for(int i = 0; i < 6; i++)
 {
  // bottom face
  if(i == 0)
  {
   glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);    
  }
  // top face
  else if(i == 1)
  {
   glBindBuffer(GL_ARRAY_BUFFER, topVBO);    
  }
  // front face
  else if(i == 2)
  {
   glBindBuffer(GL_ARRAY_BUFFER, frontVBO);    
  }
  // back face
  else if(i == 3)
  {
   glBindBuffer(GL_ARRAY_BUFFER, backVBO);    
  }
  // left face
  else if(i == 4)
  {
   glBindBuffer(GL_ARRAY_BUFFER, leftVBO);    
  }
  // right face
  else
  {
   glBindBuffer(GL_ARRAY_BUFFER, rightVBO);    
  } 

  vertices = (Vertex*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

  currentVertex = 0;

  for(int x = 0; x < size; x++)
  {
   for(int z = 0; z < size; z++)
   {
    currentVertex = z * size + x;

    vertex = &vertices[currentVertex];

    vertex->xTextureCoord = (x * 1.0f) / 512.0f;
    vertex->zTextureCoord = (z * 1.0f) / 512.0f;

    Vector3 normal;

    vertex->xNormal = normal.x;
    vertex->yNormal = normal.y;
    vertex->zNormal = normal.z;

    vertex->x = heightMapCubeFace[i][x][z][0];
    vertex->y = heightMapCubeFace[i][x][z][1];
    vertex->z = heightMapCubeFace[i][x][z][2];

    vertex->x *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->y *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->z *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
   }
  }
  glUnmapBuffer(GL_ARRAY_BUFFER);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
}

Я исключил метод setIndexBufferObject (), так как он работает нормально.

Затем я рендеринг сферы с помощью этого метода:

void Planet::render()
{
    // bottom face

    glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bottomIBO);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(6 * sizeof(float)));

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3 * sizeof(float)));

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

 TextureManager::Inst()->BindTexture(textueIDs[0]);
 glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);
 glDrawElements(GL_TRIANGLE_STRIP, numberOfIndices, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

 // next face and so on...

Текстуры загружаются с использованием бесплатного изображения, как вы можете видеть из приведенного выше кода. Я просто использую пример менеджера текстур, который поставляется с freeimage.

Почему используется связываниетекстура не работает?

Ответы [ 2 ]

1 голос
/ 08 ноября 2010
glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);

Что вы пытаетесь здесь сделать?

Активный текстурный блок не имеет ничего общего со случайным текстурным объектом.

1 голос
/ 08 ноября 2010

Почему не работает связывание текстуры?

Точное описание поведения, которое вы видите, или, лучше, прикрепление URL-адреса к скриншоту, имеет большое значение при решении графических вопросов.

Далее вам нужно включить состояние ошибки gl или хотя бы продемонстрировать, что в коде, который вы проверяете и не выполняете, если glGetError () не возвращает GL_NO_ERROR.

Ваше состояние элемента VBO / draw выглядит разумно, хотя вы намеренно опустили определение объекта буфера индекса, поэтому мы будем полагать, что вы отправляете реальные индексы в вызов glDrawElements (). Для проверки работоспособности выполните вызов glDrawElements () с указателем необработанных индексов, а не привязывайте VBO для элементов.

Вы также опустили определение типа Vertex, которое необходимо для того, чтобы узнать, соответствуют ли смещения, которые вы предоставляете для glTexCoordPointer (), определению структуры.

Наконец, я предполагаю, что большинство людей на форуме не знают «свободного изображения», которое, как я полагаю, является тем, что, как вы заявили, вы используете для загрузки текстур. Если есть проблема с текстурированием, ее невозможно увидеть из-за непрозрачной природы использования сторонней библиотеки для настройки текстурирования от вашего имени.

Если они перепутали идентификаторы текстуры, установите режим обтекания, который не поддерживается, не устанавливайте фильтр минимизации в соответствии с ожидаемым отображением (вкл / выкл), не включайте текстурирование, или устанавливайте режим среды текстур таким образом, чтобы модуляция с цветом основной геометрии не такая, как вы ожидаете - все это приведет к тому, что текстурирование не сработает / будет работать.

Для устранения неполадок просто используйте библиотеку для загрузки текстуры и используйте ID текстуры, который они предоставляют. Затем настройте режимы фильтра и текстуру среды самостоятельно. Отключите отображение в процессе поиска неисправностей. Неполные цепочки mipmap - очень распространенная ошибка при текстурировании.

Вы также можете отключить операции для каждого фрагмента, чтобы упростить устранение неполадок. Отключить смешивание, проверку глубины и ножницы.

Предполагая, что ваша текстура является силой двух измерений или ваша реализация поддерживает NPOT, попробуйте эти параметры немедленно перед рисованием:

glDisable (GL_DEPTH_TEST);
glDisable (GL_BLEND); * * тысяча двадцать шесть glDisable (GL_SCISSOR_TEST); * * тысяча двадцать-семь glColor4f (1,0f, 1,0f, 1,0f, 1,0f);
glBindTexture (GL_TEXTURE_2D, texID);
glTexEnvi (GL_TEXTURE_ENV_MODE, GL_REPLACE); // отключаем модуляцию
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // отключаем мипмаппинг
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // отключаем повторы
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

...