0

程序成功加载了所有内容,我接受的代码完全是脏的,但我至少正在尝试绘制一些东西。但似乎出了点问题,没有错误,没有显示:P

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();
};

objloader.cpp

#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);
}
4

2 回答 2

1

抱歉,由于文本绘制,我刚刚意识到投影模式是 Ortho,代码按预期工作。

于 2013-02-26T14:18:03.727 回答
0

您永远不会调用 glGenBuffers 来创建 vbo。在绑定此缓冲区之前进行此调用。否则,您将尝试使用未设置的 vbo id 绑定不存在的缓冲区。

于 2013-02-26T11:59:59.527 回答