Jump to content

  • Log In with Google      Sign In   
  • Create Account


problem with broken fragment improperly rendering


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
2 replies to this topic

#1 XMaterial   Members   -  Reputation: 100

Like
0Likes
Like

Posted 20 January 2011 - 10:02 PM

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[i].material]->diffuse);
			glMaterialfv(GL_FRONT,GL_AMBIENT,material[face[i].material]->ambient);
			glMaterialfv(GL_FRONT,GL_SPECULAR,material[face[i].material]->specular);
			glBegin(GL_TRIANGLES);
			
			glNormal3fv(face_normal[i]);
			glNormal3fv(vertex_normal[i*3]);
			glVertex3fv(mesh[meshcount]->vertices[face[i].index[0]]);
			glNormal3fv(vertex_normal[i*3+1]);
			glVertex3fv(mesh[meshcount]->vertices[face[i].index[1]]);
			glNormal3fv(vertex_normal[i*3+2]);
			glVertex3fv(mesh[meshcount]->vertices[face[i].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;
}

Attached Thumbnails

  • dsdsa.JPG


Sponsor:

#2 lc_overlord   Members   -  Reputation: 435

Like
0Likes
Like

Posted 21 January 2011 - 06:29 AM

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

#3 CRYP7IK   Members   -  Reputation: 793

Like
0Likes
Like

Posted 21 January 2011 - 06:35 AM

            glBegin(GL_TRIANGLES);
            
            glNormal3fv(face_normal[i]);
            glNormal3fv(vertex_normal[i*3]);
            glVertex3fv(mesh[meshcount]->vertices[face[i].index[0]]);
            glNormal3fv(vertex_normal[i*3+1]);
            glVertex3fv(mesh[meshcount]->vertices[face[i].index[1]]);
            glNormal3fv(vertex_normal[i*3+2]);
            glVertex3fv(mesh[meshcount]->vertices[face[i].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?
To accomplish great things we must first dream, then visualize, then plan...believe... act! - Alfred A. Montapert
Gold Coast Studio Manager, Lead Programmer and IT Admin at Valhalla Studios Bifrost.




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