2013-06-26 2 views
-4

.obj 모델을 가져올 클래스를 코딩했습니다. 그러나 법선이 올바르지 않은 것처럼 보입니다. 그래서 여러 날 동안 내 코드에서 버그를 찾으려고 노력했습니다.하지만 찾지 못했습니다. 다음 코드를 "glDrawElement()"으로 변경했습니다.glNormalPointer가 올바르지 않은 것 같습니다.

for(int i=0;i<trianglesNumber;i++) 
{ 
glBegin(GL_TRIANGLES); 
glNormal3f();glVertex3f(); 
glNormal3f();glVertex3f(); 
glNormal3f();glVertex3f(); 
glEnd(); 
} 

그러면 법선이 올바른 것입니다.

이 문제를 해결하는 방법을 알고 싶습니다. 큰 모델을 가져올 때 두 번째 방법으로 FPS가 너무 낮습니다.이 문제를 해결하는 데 많은 도움을 주시면 감사하겠습니다.

다음은 두 가지 방법의 코드와 결과입니다.

1 : glDrawElemnt 내게 준 것을

void init() 
{ 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glTexCoordPointer(3,GL_DOUBLE,0,textures); 
    glNormalPointer(GL_DOUBLE,0,normals); 
    glVertexPointer(3,GL_DOUBLE,0,vertex); 
} 

다음 glDrawElements(GL_TRIANGLES,faces*3,GL_UNSIGNED_INT,vertexIndex);

1st method.This what glDrawElemnt gave me.

1 method.This.

2 :

for(int i=0;i<trianglesNumber;i++) 
{ 
glBegin(GL_TRIANGLES); 
glNormal3f();glVertex3f(); 
glNormal3f();glVertex3f(); 
glNormal3f();glVertex3f(); 
glEnd(); 
} 

2nd method

두번째 방법은

+1

작동 코드를 보여 줬지만 * "작동하지 않는"코드는 무엇입니까? 우리가 실제로 무엇을하고 있는지 모른다면 우리가 잘못하고있는 것을 말할 수 없습니다. 'glNormalPointer' 자체는 물론 깨지지 않습니다. –

답변

0

이 페이지는 나에게 방법을 보여 주었다. http://www.opengl.org/wiki/VBO_-_just_examples

내 코드는 다음과 같습니다. 친절 ................................. 도움이 당신에 대한

enter image description here

#include"gl\glew.h" 
#include"obj-catcher.h" 
#include"gl\glut.h" 

#define ushort unsigned int 
#define BUFFER_OFFSET(i) ((char *)NULL + (i)) 

Catch A("models\\ballALL.obj"); 
int xRot=0; 
int Size=1; 
GLfloat lightPos[]={0.0f,0.0f,500.0f,10}; 
GLfloat specular[]={1.0f,1.0f,1.0f,1.0f}; 
GLfloat specref[]={1.0f,1.0f,1.0f,1.0f}; 
GLfloat ambientLight[]={1.0f,1.0f,0.0f,1.0f}; 
GLfloat spotDir[]={0.0f,0.0f,-1.0f}; 

GLuint VertexVBOID,IndexVBOID; 

struct MyVertex 
{ 
    float x, y, z; 
    Normal vn; 
    float s0, t0 , w0; 
}*pvertex; 
unsigned int *index; 
int something() 
{ 
    glEnable(GL_LIGHTING); 
    glClearColor(0.0f,0.0f,0.0f,1.0f); 
    glShadeModel(GL_SMOOTH); 
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambientLight); 
    glLightfv(GL_LIGHT0,GL_DIFFUSE,ambientLight); 
    glLightfv(GL_LIGHT0,GL_SPECULAR,specular); 
    glLightfv(GL_LIGHT0,GL_POSITION,lightPos); 
    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,60.0f); 
    glEnable(GL_LIGHT0); 
    return 0; 
} 
int SetupRC() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glClearDepth(1); 
    pvertex=new MyVertex [A.get_f()*3]; 
    index=new unsigned int [A.get_f()*3]; 
    for(int i=0;i<A.get_f()*3;i++) 
    { 
     index[i]=i; 
     pvertex[i].x=A.get_vertex()[A.get_vi()[i]*3];pvertex[i].y=A.get_vertex()[A.get_vi()[i]*3+1];pvertex[i].z=A.get_vertex()[A.get_vi()[i]*3+2]; 
     pvertex[i].s0=A.get_texture()[A.get_ui()[i]*3+0];pvertex[i].t0=A.get_texture()[A.get_ui()[i]*3+1];pvertex[i].w0=A.get_texture()[A.get_ui()[i]*3+2]; 
     pvertex[i].vn=A.get_normal()[A.get_vni()[i]]; 
    } 
    glGenBuffers(1, &VertexVBOID);//注意这句在原文章里是错的。原文章的网址在本文最下方 
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*3*A.get_f(), &pvertex[0].x, GL_STATIC_DRAW); 
    glGenBuffers(1, &IndexVBOID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(ushort)*3*A.get_f(), index, GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glEnableVertexAttribArray(0);                       //We like submitting vertices on stream 0 for no special reason 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0));  //VBO顶点数据在内存中的起始位置 
    glEnableVertexAttribArray(1);                       //我们把法线在编号为1的流中提交,没什么特别的原因 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(12));//法线在内存中的起始位置,偏移量为12字节 
    glEnableVertexAttribArray(2);                       //我们把纹理在编号为2的流中提交,没什么特别的原因 
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(24));//纹理在内存中的起始位置,偏移量为24字节 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glNormalPointer(GL_FLOAT,sizeof(MyVertex),BUFFER_OFFSET(12)); 
    glTexCoordPointer(3,GL_FLOAT,sizeof(MyVertex),BUFFER_OFFSET(12)); 
    if(index) {delete [] index;index=NULL;} 
    if(pvertex){delete [] pvertex;pvertex=NULL;} 
    something(); 
    return 0; 
} 
void renderscene() 
{ 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glColor3f(1.0,1.0,1.0); 
    glPushMatrix(); 
     glRotatef(xRot++,0.0f,1.0f,0.0f); 
      glDrawElements(GL_TRIANGLES,A.get_f()*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 
    glPopMatrix(); 
    glutSwapBuffers(); 
} 
void TimerFunction(int value) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(33,TimerFunction,1); 
} 
void windowchange(int w,int h) 
{ 
    float fAspect; 
    if(h==0) 
     h=1; 
    glViewport(0,0,w,h); 
    fAspect=(GLfloat)w/(GLfloat)h; 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1*Size,Size,-1*Size,Size,-1*Size,Size); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 
int main(int argc,char *argv[]) 
{ 
    glutInit(&argc , argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); 
    glutInitWindowSize(300,300); 
    glutCreateWindow("obj-catcher,example(for OpenGL)"); 
    glutReshapeFunc(windowchange); 
    glutDisplayFunc(renderscene); 
    glutTimerFunc(1,TimerFunction,1); 
    glewInit(); 
    SetupRC(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glutMainLoop(); 
    if(index) {delete [] index;index=NULL;} 
    if(pvertex){delete [] pvertex;pvertex=NULL;} 
    return 0; 
} 
감사합니다 ....

관련 문제