Advertisement

problem with broken fragment improperly rendering

Started by January 21, 2011 04:02 AM
1 comment, last by nhold 13 years, 10 months ago
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;
}

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.
Advertisement


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?

Engineering Manager at Deloitte Australia

This topic is closed to new replies.

Advertisement