2012-09-21 160 views
3

我已经被赋予了导入obj文件并将其加载到C++中的任务。OpenGl没有正确渲染.obj文件

它正确加载文件但不正确地移动它。任何人都可以看到我的设置opengl的东西有什么问题吗? :)

这里是什么样的渲染看起来像ATM http://imageshack.us/a/img267/3003/captureizd.png

#define _USE_MATH_DEFINES 
#include<stdio.h> 
#include <GL/glew.h> 
#include <GL/glut.h> 
#include "InitShader.h" 
#include <math.h> 
#include "MatrixStack.h" 
#include "Object.h" 
#include <time.h> 

#define BUFFER_OFFSET(offset) ((GLvoid*) (offset)) 
float x = 1.0; 
const int NumVertices = 144; 
const int NumIndicies = 104; 
GLfloat vertices[NumVertices]; 

// RGBA olors 
GLfloat vertexColours[NumVertices]; 

// each entry is an index into the vertices matrix 
GLint vertexIndicies[NumIndicies]; 


//GLfloat vertices2[NumVertices]; 

// RGBA olors 
//GLfloat vertexColours2[NumVertices]; 

// each entry is an index into the vertices matrix 
//GLint vertexIndicies2[NumIndicies]; 

GLuint vao; 
GLuint program; 
GLuint buffers[2]; 
GLfloat radius = 1.0; 

GLfloat theta = 0.0; 
GLfloat phi = 0.0; 

const GLfloat dr = 5.0 * M_PI/180.0; 

// Projection transformation parameters 

GLfloat left2 = -1.0, right2 = 1.0; 
GLfloat bottom = -1.0, top = 1.0; 
GLfloat zNear = 0.5, zFar = 3.0; 

GLuint modelView; // model-view matrix uniform shader variable location 
GLuint projection; // projection matrix uniform shader variable location 

MatrixStack modelViewStack(5); 
MatrixStack projectionStack(5); 
// OpenGL initialization 
void 
init() 
{ 
     srand (time(NULL)); 
     Object myst("assignment1.obj"); 
     float *tempFloat = myst.verts(); 
     float *tempFloat2 = myst.indis(); 
     for (unsigned int i=0; i<NumVertices; vertices[i]=tempFloat[i],i++); 
     for (unsigned int i=0; i<NumIndicies; vertexIndicies[i]=tempFloat2[i],i++); 
     for (unsigned int i=0; i<NumVertices;i++){ 
      float a = (float)(rand()%10); 
      a = a/10; 
      cout << a; 
      vertexColours[i]=a; 
     } 
     for (unsigned int i=0; i<NumVertices; cout << vertices[i] << endl ,i++); 
     for (unsigned int i=0; i<NumIndicies; cout << vertexIndicies[i] << endl ,i++); 
     glEnable(GL_DEPTH_TEST); 
     //make background yerpul in colour 
     glClearColor(0.235, 0.194, 0.314, 1.0); 

     // Load shaders and use the resulting shader program 
     program = InitShader("vshader41.glsl", "fshader41.glsl"); 
     glUseProgram(program); 

     // Create a vertex array object 
     glGenVertexArrays(1, &vao); 
     glBindVertexArray(vao); 

     // Create and initialize two buffer objects 
     glGenBuffers(2, buffers); 

     //one buffer for the vertices and colours 
     glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(vertexColours),NULL, GL_STATIC_DRAW); 
     glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 
     glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertexColours), vertexColours); 

     //one buffer for the indices 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexIndicies),vertexIndicies, GL_STATIC_DRAW); 

     // set up vertex arrays 
     GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
     glEnableVertexAttribArray(vPosition); 
     glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

     GLuint vColor = glGetAttribLocation(program, "vColor"); 
     glEnableVertexAttribArray(vColor); 
     glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertices))); 

     modelView = glGetUniformLocation(program, "model_view"); 
     projection = glGetUniformLocation(program, "projection"); 

     glBindBuffer(GL_ARRAY_BUFFER, 0); 
     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
     glBindVertexArray(0); 
     } 

//---------------------------------------------------------------------------- 

void 
display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    modelViewStack.loadIdentity(); 
    modelViewStack.lookAt(radius*sin(theta)*cos(phi), 
      radius*sin(theta)*sin(phi), 
      radius*cos(theta), 
      0.0,0.0,0.0, 
      0.0,1.0,0.0); 

    glUniformMatrix4fv(modelView, 1, GL_FALSE, modelViewStack.getMatrixf()); 

    projectionStack.loadIdentity(); 
    projectionStack.ortho(left2,right2,bottom,top,zNear,zFar); 

    glUniformMatrix4fv(projection, 1, GL_FALSE, projectionStack.getMatrixf()); 

    glBindVertexArray(vao); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
    //Indexing into vertices we need to use glDrawElements 
    glDrawElements (GL_TRIANGLES, NumIndicies, GL_UNSIGNED_INT, 0); 
    glutSwapBuffers(); 
} 

//---------------------------------------------------------------------------- 

void keyboard(unsigned char key, int x, int y) 
{ 
    switch(key) { 
     case 033: // Escape Key 
     case 'q': case 'Q': 
     exit(EXIT_SUCCESS); 
     break; 

     case 'x': left2 *= 1.1; right2 *= 1.1; break; 
     case 'X': left2 *= 0.9; right2 *= 0.9; break; 
     case 'y': bottom *= 1.1; top *= 1.1; break; 
     case 'Y': bottom *= 0.9; top *= 0.9; break; 
     case 'z': zNear *= 0.9; zFar *= 1.1; break; 
     case 'Z': if (zNear<zFar){zNear *= 1.1; zFar *= 0.9;} break; 
     case 'r': radius *= 2.0; break; 
     case 'R': radius *= 0.5; break; 
     case 'o': theta += dr; break; 
     case 'O': theta -= dr; break; 
     case 'p': phi += dr; break; 
     case 'P': phi -= dr; break; 

     case ' ': // reset values to their defaults 
     left2 = -1.0; 
     right2 = 1.0; 
     bottom = -1.0; 
     top = 1.0; 
     zNear = -1.0; 
     zFar = 1.0; 

     radius = 1.0; 
     theta = 0.0; 
     phi = 0.0; 
     break; 
    } 

    glutPostRedisplay(); 
} 
//---------------------------------------------------------------------------- 
void idle(){ 
    theta += .001; 

    left2 += .0001; 

    glutPostRedisplay(); 
} 
//---------------------------------------------------------------------------- 
void 
reshape(int width, int height) 
{ 
    glViewport(0, 0, width, height); 
} 

//---------------------------------------------------------------------------- 


int 
main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(512, 512); 
    glutCreateWindow("Orbit the Color Cube - Orthographic"); 

    glewInit(); 

    init(); 
    glutIdleFunc(idle); 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutReshapeFunc(reshape); 

    glutMainLoop(); 
    return 0; 
} 
+1

我没有看到图片...你怎么知道obj是正确加载? – codeling

+0

Woops忘了附上它。我打印出obj文件的数组,正是它的要求。 –

+0

我现在增加了图像对不起:) –

回答

1

图片在obj文件的面的顶点指数从1开始,而不是0可以预料。尝试在加载文件时将每个索引减1。如果我正确地读你的代码,这条线:

for (unsigned int i=0; i<NumIndicies; vertexIndicies[i]=tempFloat2[i],i++);

应该

for (unsigned int i=0; i<NumIndicies; vertexIndicies[i]=tempFloat2[i] - 1,i++);

+0

这虽然有所帮助,但它仍然渲染不正确更多的是一个错误。生病更新后的一些新图片 –

+0

Actualy this和我的组合没有定义正确的数字的顶点是Thanzx队友的问题 –