Jump to content
  • Advertisement
Sign in to follow this  
asp_kom

OpenGL lib3ds + texture coordinates

This topic is 2473 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
Advertisement
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);

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!