Jump to content

  • Log In with Google      Sign In   
  • Create Account

lib3ds + texture coordinates


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 asp_kom   Members   -  Reputation: 111

Like
0Likes
Like

Posted 02 March 2012 - 10:10 AM

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:
Posted Image

Here is model with texture coordinates interpreted as colors:
Posted Image

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[i];
  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:
Posted Image

What am I doing wrong?Posted Image

Sponsor:

#2 RobinsonUK   Members   -  Reputation: 108

Like
0Likes
Like

Posted 02 March 2012 - 12:32 PM

I can't see where you're binding a sampler.

#3 asp_kom   Members   -  Reputation: 111

Like
0Likes
Like

Posted 03 March 2012 - 01:45 AM

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);


#4 asp_kom   Members   -  Reputation: 111

Like
0Likes
Like

Posted 03 March 2012 - 08:51 AM

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 ...Posted Image

#5 asp_kom   Members   -  Reputation: 111

Like
0Likes
Like

Posted 03 March 2012 - 09:17 AM

Posted Image
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 Posted Image

#6 asp_kom   Members   -  Reputation: 111

Like
0Likes
Like

Posted 03 March 2012 - 09:21 AM

How to rename Topic to mark it as SOLVED ? Posted Image




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS