使用for循环的OpenGL多维数据集

use*_*051 1 c++ opengl xcode

使用C++和OpenGL,我使用四边形,线条和点绘制了一个Cube.我现在正试图让我的代码更密集.为了达到这个目的,我想使用for循环.

我的立方体的顶点是二维数组,如下所示:

double vertices[8][3] = {
    { 1.0f, 1.0f, 1.0f}, //0
    { 1.0f, 1.0f,-1.0f}, //1
    { 1.0f,-1.0f,-1.0f}, //2
    {-1.0f,-1.0f,-1.0f}, //3
    {-1.0f,-1.0f, 1.0f}, //4
    {-1.0f, 1.0f, 1.0f}, //5
    {-1.0f, 1.0f,-1.0f}, //6
    { 1.0f,-1.0f, 1.0f}  //7
};
Run Code Online (Sandbox Code Playgroud)

目前我用线条绘制立方体的代码是

void drawLines(){
    glBegin(GL_LINES);
    //Front Lines
    //Left
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    //Top
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Bottom
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    //Right
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Middle Lines
    //Top Left
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    //Top Right
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Bottom Left
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    //Bottom Right
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    //Back Lines
    //Left
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    //Top
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
    //Bottom
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    //Right
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);

    glEnd();                    // Done Drawing Edges
}
Run Code Online (Sandbox Code Playgroud)

这实现了这个结果: 在此输入图像描述

为了压缩我的代码,我试图使用for循环获得相同的结果,目前我有这个:

glBegin(GL_LINES);

for ( int i=0; i<8; i+=1 ) {
    for (int j=0; j<8; j+=1) {
        glVertex3f(vertices[i][0],vertices[i][1],vertices[i][2]);
        glVertex3f(vertices[j][0],vertices[j][1],vertices[j][2]);
    }
}
glEnd();
Run Code Online (Sandbox Code Playgroud)

这给了我这个结果: 在此输入图像描述

我的问题是,是否有人能够给我指导以获得与原始代码相同的结果?

rat*_*eak 7

为索引添加数组:

int[12][2] indices = {
    {5,4},
    {5,0},

    {4,7},
    {7,0},

    {6,5},
    {1,0},

    {3,4},
    {2,7},

    {6,3},
    {6,1},

    {3,2},
    {2,1}
}
Run Code Online (Sandbox Code Playgroud)

并循环:

glBegin(GL_LINES);

for ( int i=0; i<12; i+=1 ) {

    glVertex3f(vertices[indices[i][0]][0],vertices[indices[i][0]][1],vertices[indices[i][0]][2]);
    glVertex3f(vertices[indices[i][1]][0],vertices[indices[i][1]][1],vertices[indices[i][1]][2]);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)

但是,不建议您使用旧的(和已弃用的)openGL进行学习.相反,建议的方法是将顶点数据上传到VBO; 创建一组着色器并使用glDrawArraysglDrawElements替代.