显示STL数据时缺少面

时间:2015-07-01 17:45:25

标签: c++ opengl

我为ASCII STL格式编写了一个简单的解析器。当我尝试使用提供的法线渲染三角形时,生成的对象缺少许多面:

这应该是这样的:

我已经尝试过:

  • 明确禁用了背面剔除(虽然它之前不应该处于活动状态)
  • 确保启用深度缓冲区

这是一个重现错误的最小示例程序:

 #include <SDL2/SDL.h>
 #include <SDL2/SDL_main.h>
 #include <SDL2/SDL_render.h>
 #include <SDL2/SDL_opengl.h>

int main(int argc, char **argv) {
    SDL_Init(SDL_INIT_VIDEO);
    int screen_w=1280,screen_h=720;
    SDL_Window * win = SDL_CreateWindow("test", 20, 20, screen_w, screen_h,
            SDL_WINDOW_OPENGL);
    SDL_GLContext glcontext = SDL_GL_CreateContext(win);


    STLParser stlparser;
    std::ifstream file(".\\logo.stl");
    stlparser.parseAscii(file);
    const auto& ndata = stlparser.getNData();
    const auto& vdata = stlparser.getVData();
    std::cout << "number of facets: " << ndata.size() << std::endl;

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);


    glMatrixMode(GL_PROJECTION | GL_MODELVIEW);
    glLoadIdentity();
    glScalef(1.f, -1.f, 1.f);
    glOrtho(0, screen_w, 0, screen_h, -screen_w, screen_w);

    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);

    glDisable(GL_CULL_FACE);

    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, 0, ndata.data());
    glVertexPointer(3, GL_FLOAT, 0, vdata.data());

    SDL_Event event;
    bool quit = false;

    while (!quit) {
        while (SDL_PollEvent(&event))
            switch(event.type) {
            case SDL_QUIT: quit = true; break;
            }
            ;
        // Drawing
        glClearColor(255,255,255,255);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glTranslatef(screen_w/2,0,0);
        glRotatef(0.5,0,1,0);
        glTranslatef(-screen_w/2,0,0);


        glPushMatrix();
        glTranslatef(screen_w/2,screen_h/2,0);


        glColor3f(0.5,0.5,0);
        glDrawArrays(GL_TRIANGLES, 0, vdata.size());

        glPopMatrix();


        SDL_GL_SwapWindow(win);

        SDL_Delay(10);
    }
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

STLParser方法getNData()getVData()具有以下签名:

const std::vector<std::array<float,3>>& getNData() const;
const std::vector<std::array<std::array<float,3>,3>>& getVData() const;

STLParser输出应该是正确的,但如果需要,我也可以提供源。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

你应该改变

glDrawArrays(GL_TRIANGLES, 0, vdata.size());

glDrawArrays(GL_TRIANGLES, 0, 3 * vdata.size());

即。 count应该是顶点计数,但不是三角计数。