Текстурирование VBO (объекты вершинного буфера)

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

Я использую 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...

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

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


person henryprescott    schedule 07.11.2010    source источник


Ответы (2)


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

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

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

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

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

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

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

Для устранения неполадок просто используйте библиотеку для загрузки текстур и используйте идентификатор текстуры, который они предоставляют. Затем самостоятельно настройте режимы фильтрации и текстурное окружение. Отключите мипмэппинг на время устранения неполадок. Неполные цепочки 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);< br> 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);

person user487158    schedule 07.11.2010

glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);

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

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

person genpfault    schedule 07.11.2010