2013-02-22 8 views
0

프로그램이 모든 프로그램을 성공적으로로드합니다. 코드는 완전히 받아 들여지지는 않지만 적어도 뭔가를 그리려고합니다. 하지만 뭔가 잘못되었거나 오류가없고 표시되지 않는 것 같습니다. PglDrawArrays가 아무 것도 그려지지 않습니다.

PS : 프로젝션,로드 파일 등 모든 것이 올바르게 설정되었습니다.

objloader.h

#pragma once 
#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <algorithm> 
#include <cassert> 
#include <cstdlib> 
#include <ctime> 
#include <iostream> 
#include <vector> 
#include "opengl.h" 
#include "terrain.h" 



struct VertexCoord 
{ 
    float x,y,z,w; 
}; 

struct TextureCoord 
{ 
    float u,v; 
}; 

struct NormalCoord 
{ 
    float x,y,z; 
}; 

struct ColorComp 
{ 
    float r,g,b; 
}; 

struct VBOVertex 
{ 
    float x,y,z,w; 
    float nx,ny,nz; 
    float u,v; 
    float r,g,b; 
}; 



class ObjLoader 
{ 

    GLuint VBO; 
    std::vector<VertexCoord> vertexData; 
    std::vector<NormalCoord> normalData; 
    std::vector<TextureCoord> textureData; 
    std::vector<ColorComp> colorData; 
    int numVerts; 
    char *modeldata; 

public: 
    ObjLoader(void); 
    ~ObjLoader(void); 
    void LoadBuffers(const char* fileName); 
    void render(); 
}; 

당신은 VBO를 만드는 glGenBuffers로 전화를 걸 결코

#include "ObjLoader.h" 
#include <fstream> 
#include <string> 
#include <sstream> 
using namespace std; 

ObjLoader::ObjLoader(void) 
{ 

    glGenBuffers(1,&VBO); 
    numVerts=0; 
} 


ObjLoader::~ObjLoader(void) 
{ 
} 


void ObjLoader::LoadBuffers(const char* fileName) { 

    ifstream fs(fileName,ios::in); 
    string line; 
    vector<string> faceList; 


    while (getline(fs,line)) { 
     if (line.substr(0,2) == "v ") { 
      istringstream s(line.substr(2)); 
      VertexCoord ver; 
      s >> ver.x >> ver.y >> ver.z; 
      vertexData.push_back(ver); 
     } 
     else if (line.substr(0,3) == "vt ") { 
      istringstream s(line.substr(3)); 
      TextureCoord ver; 
      s >> ver.u >> ver.v; 
      textureData.push_back(ver); 
     } 
     else if (line.substr(0,3) == "vn ") { 
      istringstream s(line.substr(2)); 
      NormalCoord ver; 
      s >> ver.x >> ver.y >> ver.z; 
      normalData.push_back(ver); 
     } 
     else if (line.substr(0,2) == "f ") { 
      faceList.push_back(line); 
     } 
     else if (line[0] == '#'){  } 
     else {  } 
    } 


    modeldata=new char[faceList.size()*3*sizeof(VBOVertex)]; 

    for (int i=0; i < faceList.size(); i++) { 
     VBOVertex newvert[3]; 

     int v[3],n[3],t[3]; 
     sscanf(faceList[i].c_str(),"f %d/%d/%d %d/%d/%d %d/%d/%d",&v[0],&t[0],&n[0], 
      &v[1],&t[1],&n[1], 
      &v[2],&t[2],&n[2]); 


     for (int j=0;j < 3; j++) { 
      newvert[j].x=vertexData[v[j]-1].x; 
      newvert[j].y=vertexData[v[j]-1].y; 
      newvert[j].z=vertexData[v[j]-1].z; 
      newvert[j].w=vertexData[v[j]-1].w; 
      newvert[j].u=textureData[t[j]-1].u; 
      newvert[j].v=textureData[t[j]-1].v; 
      newvert[j].nx=normalData[n[j]-1].x; 
      newvert[j].ny=normalData[n[j]-1].y; 
      newvert[j].nz=normalData[n[j]-1].z; 
     } 
     memcpy(modeldata + (i*3*sizeof(VBOVertex)),newvert,3*sizeof(VBOVertex)); 
     numVerts++; 

    } 



    glBindBuffer(GL_ARRAY_BUFFER,VBO); 
    glBufferData(GL_ARRAY_BUFFER,faceList.size()*3*sizeof(VBOVertex),(char*)modeldata,GL_STATIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER,0); 


} 


void ObjLoader::render() { 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, sizeof(VBOVertex), BUFFER_OFFSET(7 * sizeof(float))); 

    glEnableClientState(GL_NORMAL_ARRAY); 
    glNormalPointer(GL_FLOAT, sizeof(VBOVertex), BUFFER_OFFSET(4 * sizeof(float))); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, sizeof(VBOVertex), BUFFER_OFFSET(0)); 

    glDrawArrays(GL_TRIANGLES,0,numVerts); 


    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

답변

0

objloader.cpp. 이 버퍼를 바인드하기 전에이 메서드를 호출합니다. 그렇지 않으면 unset vbo id와 함께 존재하지 않는 버퍼를 바인드하려고합니다.

1

죄송합니다. 저는 투영 모드가 텍스트 그리기 때문에 Ortho라는 것을 깨달았습니다. 코드는 의도 한대로 작동합니다.