Witam!

Otóż mam sobie program OpenGL, który:
*Ładuje mi sferę w postaci .obj (przygotowanej w Blenderze i wyeksportowanej do pliku), zawiera ona vertexy i uv
*Ładuje mi teksturę ziemi, na którą zmapowałem ziemię

Jednak program nie mapuje tekstury poprawnie:
http://fotoo.pl/show.php?img=569484_program-screen.png.html

Jak nietrudno się domyślić celem programu było rozciągnięcie tekstury ziemi na siatce sfery, testowałem również na innych modelach i teksturach. W każdym przypadku, w którym próbowałem tekstura również powiela się na każdym trójkącie modelu.

Jeżeli przyjrzeć się dokładnie wynikom to widać, że OpenGL próbuje mapować na każdy trójkąt bitmapę od początku.
Prawdopodobie problem jest ze współrzędnymi UV (być nie wygenerowałem ich poprawnie w Blenderze). Jednak w trakcie działania programu współrzędne uv to np. (0.25, 0.5), (0.26, 0.53), (0.26, 0.54) i nawet, jeżeli UV są niepoprawne to powinny być inaczej zmapowane na sferę.

Zastanawiam się czy zrobiłem to dobrze w blenderze (w tym temacie jestem ekstremalnie początkujący), mapując teksturę wykonałem wszystkie kroki podane w poniższej instrukcji

http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/UV_Map_Basics

A może trzeba dodać jakieś dodatkowe własności stanu tekstury?

Kod zajmujący się inicjalizacją tekstur:

bool Program::InitTextures(string texturePath)
{
  textureID = LoadTextureBMP_custom(texturePath);
  GLuint TBO_ID;
  glGenBuffers(1,&TBO_ID);
  glBindBuffer(GL_ARRAY_BUFFER,TBO_ID);
  glBufferData(GL_ARRAY_BUFFER,uv.size()*sizeof(vec2),&uv[0],GL_STATIC_DRAW);
  return true;
}

Fragment LoadTextureBMP_custom() przygotowujący stan tekstury:

  GLuint texID;
  glGenTextures(1,&texID);
  glBindTexture(GL_TEXTURE_2D,texID);
  glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,width,height,0,GL_BGR,GL_UNSIGNED_BYTE,(GLvoid*)&data[0]);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  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);
  return texID;

Przekazywanie UV'ów do Shadera:

   glEnableVertexAttribArray(1);
   glBindBuffer(GL_ARRAY_BUFFER,TBO_ID);
   glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0);

VS:

#version 330

layout(location = 0) in vec3 vertexPosition;
layout(location = 1) in vec2 vertexUV;
out vec2 UV;

uniform mat4 MVP;

void main()
{
  vec4 v = vec4(vertexPosition,1.0f);
  gl_Position = MVP*v;
  UV = vertexUV;
}

FS:

#version 330

in vec2 UV;
out vec4 color;

uniform sampler2D texSampler; // Uchwyt tekstury

void main()
{
  color = texture(texSampler, UV.st);
}

[Edit] Problem rozwiązany, omyłkowa lokalna deklaracja GLuint TBO_ID w Texture::InitTextures przysłoniła deklarację pola globalnego TBO_ID (niestety za mało kodu w wątku, aby ktoś mógł mi pomóc).