• Advertisement
Sign in to follow this  

problem with broken fragment improperly rendering

This topic is 2558 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

i am currently using lib3ds library loading a vehicle model from 3ds file after i draw in on the screen it appears that there r a lot of broken fragment and cannot be rendered properly.it seems that there r some far points draw onto a nearer surface but i`ve no idea what `s the problem really any answer would be appreciated.


#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <lib3ds.h>
#include <iostream>

typedef float Lib3dsVector[3];
typedef float Lib3dsTexel[2];
using namespace std;

Lib3dsFile* model;
Lib3dsMesh** mesh;
Lib3dsCamera** camera;
Lib3dsFace* face;
Lib3dsLight** light;
Lib3dsMaterial** material;

unsigned long total_face;

void lightup()
{
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);
float gambient[]={0.2,0.2,0.2,1.0};
float lightpos[]={1.0,1.0,1.0,0.0};
float lambient[]={0.8,0.8,0.8,1.0};
float ldiffuse[]={1.0,1.0,1.0,1.0};
float lspecular[]={0.3,0.3,0.3,1.0};

glClearColor(0.0,0.0,0.0,0.0);

glLightfv(GL_LIGHT0,GL_DIFFUSE,ldiffuse);
glLightfv(GL_LIGHT0,GL_AMBIENT,lambient);
glLightfv(GL_LIGHT0,GL_SPECULAR,lspecular);
glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,gambient);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void display()
{
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0);
glDepthFunc(GL_LEQUAL);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(camera[0]->position[0]+1000,camera[0]->position[1],camera[0]->position[2],camera[0]->target[0],camera[0]->target[1],camera[0]->target[2],0.0,0.0,1.0);

glColor3f(1.0,0.0,0.0);
glPushMatrix();
lightup();
glTranslatef(0.0,0.0,-1000.0);
long meshcount;
for(meshcount=0;meshcount<model->nmeshes;meshcount++)
{
face=mesh[meshcount]->faces;
Lib3dsVector* vertex_normal=new Lib3dsVector[mesh[meshcount]->nfaces*3];
Lib3dsVector* face_normal=new Lib3dsVector[mesh[meshcount]->nfaces];
lib3ds_mesh_calculate_vertex_normals(mesh[meshcount],vertex_normal);
lib3ds_mesh_calculate_face_normals(mesh[meshcount],face_normal);
for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
glMaterialfv(GL_FRONT,GL_DIFFUSE,material[face.material]->diffuse);
glMaterialfv(GL_FRONT,GL_AMBIENT,material[face.material]->ambient);
glMaterialfv(GL_FRONT,GL_SPECULAR,material[face.material]->specular);
glBegin(GL_TRIANGLES);

glNormal3fv(face_normal);
glNormal3fv(vertex_normal[i*3]);
glVertex3fv(mesh[meshcount]->vertices[face.index[0]]);
glNormal3fv(vertex_normal[i*3+1]);
glVertex3fv(mesh[meshcount]->vertices[face.index[1]]);
glNormal3fv(vertex_normal[i*3+2]);
glVertex3fv(mesh[meshcount]->vertices[face.index[2]]);
glEnd();
}
}

glPopMatrix();
/*
glPushMatrix();
glTranslatef(0.0,0.0,-2000.0);
glColor3f(1.0,1.0,1.0);
glBegin(GL_QUADS);
glVertex3f(-10000.0f,-10000.0f,0.0f);
glVertex3f(10000.0f,-10000.0f,0.0f);
glVertex3f(10000.0f,10000.0f,0.0f);
glVertex3f(-10000.0f,10000.0f,0.0f);
glEnd();
glPopMatrix();
*/

glutSwapBuffers();
}

void keypress(unsigned char key,int x,int y)
{
switch(key)
{
case 27:
exit(0);
break;
}
}
void reshape(int w,int h)
{
if(h==0) h=1;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,w/h,0.0,5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc,char* argv[])
{

glutInit(&argc,argv);
model=lib3ds_file_open("vehicle.3DS");
if(model==NULL) cout<<"Error"<<endl; else cout<<model->nmaterials<<endl;
mesh=model->meshes;
material=model->materials;
camera=model->cameras;
light=model->lights;
cout<<"Light Num:"<<model->nlights<<endl;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BITS);

glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(800,800);
glutInitWindowPosition(100,100);
glutCreateWindow("VC 2008 Glut");
//glutFullScreen();
glShadeModel(GL_FLAT);
glutKeyboardFunc(keypress);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

Share this post


Link to post
Share on other sites
Advertisement
the only problem i could see is that the znear and zfar has been set to odd values, at least compared to the rest of the values you use.
[font="Arial"]zfar is at 5.0f while still you pull the camera back by 1000.0f, im not sure it's the problem, but it could cause problems, so try setting znear/zfar in gluPerspective to 0.1f/1000.0f and adjust the camera if needed.[/font]

Share this post


Link to post
Share on other sites


glBegin(GL_TRIANGLES);

glNormal3fv(face_normal);
glNormal3fv(vertex_normal[i*3]);
glVertex3fv(mesh[meshcount]->vertices[face.index[0]]);
glNormal3fv(vertex_normal[i*3+1]);
glVertex3fv(mesh[meshcount]->vertices[face.index[1]]);
glNormal3fv(vertex_normal[i*3+2]);
glVertex3fv(mesh[meshcount]->vertices[face.index[2]]);
glEnd();
}




Probably shouldn't put glBegin and glEnd inside of the for loop because that is a fairly big performance hit. Better yet, don't use glBegin or glEnd at all.

Have you tried using GL_TRIANGLE_STRIP instead of just GL_TRIANGLES?

Share this post


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

  • Advertisement