lib3ds + texture coordinates

Started by
4 comments, last by asp_kom 12 years, 1 month ago
Does anybody have experience with lib3ds?
Using OpenGL with GLSL shaders.
Looks like model is loaded fine. But when I try to render it with texture, I recieve something horrible:
glsl_Textured.png

Here is model with texture coordinates interpreted as colors:
glsl_Texcoords.png

Here is my code for loading texture (gDebugger shows that texture is loaded normally):

glGenTextures(1,&textureId);
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename);
FIBITMAP* fib = FreeImage_Load(fif,filename,0);
int width  = FreeImage_GetWidth(fib);
int height = FreeImage_GetHeight(fib);
char* pixels = (char*)FreeImage_GetBits(fib);
glBindTexture(GL_TEXTURE_2D,textureId);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
FreeImage_Unload(fib);


Here is my code for loading model (I work with GLM library):

glm::vec3 *vertices  = new glm::vec3[m_TotalFaces*3];
glm::vec3 *normals  = new glm::vec3[m_TotalFaces*3];
glm::vec2 *texCoords = new glm::vec2[m_TotalFaces*3];
Lib3dsMesh * mesh;
unsigned int FinishedFaces = 0;
// Loop through all the meshes
for (int i = 0; i < m_model->nmeshes; i++)
{
  mesh = m_model->meshes;
  lib3ds_mesh_calculate_face_normals(mesh, (float (*)[3])&normals[FinishedFaces*3][0]);
  // Loop through every face
  for(unsigned int cur_face = 0; cur_face < mesh->nfaces;cur_face++)
  {
   Lib3dsFace * face = &mesh->faces[cur_face];
   for(unsigned int i = 0;i < 3;i++)
   {
    memcpy(&vertices[FinishedFaces*3 + i][0], mesh->vertices[face->index[ i ]], sizeof(float)*3);
    memcpy(&texCoords[FinishedFaces*2+i][0], mesh->texcos[face->index[ i ]], sizeof(float)*2);
   }
   FinishedFaces++;
  }
}
// Generate a Vertex Buffer Object and store it with our vertices
glf_->glGenBuffers(1, &m_VertexVBO);
glf_->glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glf_->glBufferData(GL_ARRAY_BUFFER, (sizeof(float)*3) * 3 * m_TotalFaces, &vertices[0], GL_STATIC_DRAW);
// Generate another Vertex Buffer Object and store the normals in it
glf_->glGenBuffers(1, &m_NormalVBO);
glf_->glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
glf_->glBufferData(GL_ARRAY_BUFFER, (sizeof(float)*3) * 3 * m_TotalFaces, &normals[0], GL_STATIC_DRAW);
// Generate Vertex Buffer Object and store texture coordinates in it
glf_->glGenBuffers(1, &m_TexcoorVBO);
glf_->glBindBuffer(GL_ARRAY_BUFFER, m_TexcoorVBO);
glf_->glBufferData(GL_ARRAY_BUFFER, (sizeof(float)*2) * 3 * m_TotalFaces, &texCoords[0], GL_STATIC_DRAW);
// Clean up our allocated memory
delete[] vertices;
delete[] normals;
delete[] texCoords;

gDebugger shows that all texture coordinates in VBO belong to interval [0.0, 1.0]

Here is my vertex shader:

#version 330
in vec3 position;
in vec2 texcord;
out vec2 o_texcord;
uniform mat4 MVP;

void main()                    
{
     gl_Position = MVP * vec4(position,1.0);
     o_texcord = texcord;
}


Here is my fragment shader:

#version 330
in vec2 o_texcord;
out vec4 fragmentColor;
uniform sampler2D textureMy;


void main()
{
     fragmentColor = texture2D( textureMy, o_texcord);
}


In 3ds max model looks fine:
3ds_Max.png

What am I doing wrong?sad.png
Advertisement
I can't see where you're binding a sampler.
Here is rendering code:

shaderProg->use();
shaderProg->setUniform("MVP",float_mvp);
//shaderProg->setUniform("textureMy",(int)GL_TEXTURE0);
shaderProg->setUniform("textureMy",(int)0);
glBindBuffer(GL_ARRAY_BUFFER, ::model->getTexcoordVBO());
int m_texcord_loc = shaderProg->getAttribLocation("texcord");
glEnableVertexAttribArray(m_texcord_loc);
glVertexAttribPointer(m_texcord_loc, 2, GL_FLOAT, GL_FALSE, 0, 0);
::model->bindTexture();
//rendering model
::model->Draw();
glUseProgram(0);


rendering model:

// Enable vertex and normal arrays
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
// Bind the vbo with the normals
glf_->glBindBuffer(GL_ARRAY_BUFFER, m_NormalVBO);
// The pointer for the normals is NULL which means that OpenGL will use the currently bound vbo
glNormalPointer(GL_FLOAT, 0, NULL);
glf_->glBindBuffer(GL_ARRAY_BUFFER, m_VertexVBO);
glVertexPointer(3, GL_FLOAT, 0, NULL);
// Render the triangles
glDrawArrays(GL_TRIANGLES, 0, m_TotalFaces * 3);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
Compared texture coordinates, verticies and faces loaded by lib3ds and my own 3ds-loader. Everything match.
Checked texture coordinates VBO with gDebugger. Coordinates are wrong ...blink.png
image.png
Error was here:

memcpy(&texCoords[FinishedFaces*2+i][0], mesh->texcos[face->index[ i ]], sizeof(float)*2);

shoul'd be:

memcpy(&texCoords[FinishedFaces*3+i][0], mesh->texcos[face->index[ i ]], sizeof(float)*2);

fail laugh.png
How to rename Topic to mark it as SOLVED ? rolleyes.gif

This topic is closed to new replies.

Advertisement