【问题标题】:OpenGL Duplicating Vertex ArraysOpenGL复制顶点数组
【发布时间】:2016-08-28 11:07:47
【问题描述】:

我正在寻找一些关于复制已经存在于数组中的索引的说明和指导。我需要从我收集的重复索引中提取,以便我可以渲染一个立方体(每一面都有不同的颜色)。 我的立方体是从“OBJ”文件中读入的。

当前代码

using std::vector;

vector<GLfloat>vertex;
vector<GLuint>faces;

GLubyte color1[] =
{
   255,255,0,
   255,255,0,
   255,255,0,
   255,255,0,

   255,0,255,
   255,0,255,
   255,0,255,
   255,0,255

};

struct OBJVertex
{
   GLint f1;
   GLint f2;
   GLint f3;

   GLfloat x;
   GLfloat y;
   GLfloat z;

}obj;

int OBJLoader::LoadOBJData(string filename)
{
   ifstream f_obj;

   string line;

   f_obj.open(filename, ios::in);

while (!f_obj.eof())
{
    getline(f_obj, line);

    if (line.find("v") != line.npos)
    {
        sscanf_s(line.c_str(), "v %f %f %f ", &obj.x, &obj.y, &obj.z);
        vertex.push_back(obj.x);
        vertex.push_back(obj.y);
        vertex.push_back(obj.z);
    }
    if (line.find("f ")!= line.npos)
    {
        sscanf_s(line.c_str(), "f %d %d %d ", &obj.f1, &obj.f2, &obj.f3);
        obj.f1 = obj.f1 - 1;
        obj.f2 = obj.f2 - 1;
        obj.f3 = obj.f3 - 1;

        faces.push_back(obj.f1);
        faces.push_back(obj.f2);
        faces.push_back(obj.f3);
    }
}
return 0;
}
void OBJLoader::RenderOBJ()
{
   glEnable(GL_DEPTH_TEST);
   glEnableClientState(GL_COLOR_ARRAY);
   glEnableClientState(GL_VERTEX_ARRAY);

   glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1);
   glVertexPointer(3,GL_FLOAT, 0, &vertex[0]);

   glDrawElements(GL_TRIANGLE_STRIP,faces.size(),GL_UNSIGNED_INT,&faces[0]);

   glDisableClientState(GL_VERTEX_ARRAY);
   glDisableClientState(GL_COLOR_ARRAY);
}

我认为我需要使用 glBindBuffer 绑定顶点和颜色数组是否正确?

glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 

我目前有一个名为“color1”的颜色数组设置,这会在绑定第一个顶点和颜色数组后为立方体的顶面和底面着色,我是否正确地认为我可以为剩余边创建两个颜色数组立方体?

想法?

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1);    // first colour array //
glVertexPointer(3,GL_FLOAT, 0, &vertex[0]);

glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT,&faces[0]);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 



glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

glColorPointer(3, GL_UNSIGNED_BYTE, 0, color2);    // second colour array //
glVertexPointer(3,GL_FLOAT, 0, &vertex[0]);

glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT,&faces[0]);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER,vertex[0]); 

----更新----

抱歉,我为每个面创建了一个颜色数组,但它只是覆盖了之前的数组。有人可以解释一下我做错了什么吗?

GLubyte color1[] =
{
    255,255,0,
    255,255,0,
    255,255,0,
    255,255,0,

    255,0,255,
    255,0,255,
    255,0,255,
    255,0,255

    };

GLubyte color2[] =
{
    255,0,0,
    255,0,0,
    255,0,0,
    255,0,0,

    0,0,255,
    0,0,255,
    0,0,255,
    0,0,255
};

GLubyte color3[] =
{
    0,255,255,
    0,255,255,
    0,255,255,
    0,255,255,

    255,0,255,
    255,0,255,
    255,0,255,
    255,0,255
};

GLubyte color4[] =
{
    255,255,255,
    255,255,255,
    255,255,255,
    255,255,255,

    0,255,0,
    0,255,0,
    0,255,0,
    0,255,0
};

void OBJLoader::RenderOBJ()
{
    glEnable(GL_DEPTH_TEST);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glVertexPointer(3, GL_FLOAT, 0, &vertex[0]);

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color1);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color2);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color3);
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color4);

    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]);
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]);
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]);
    glDrawElements(GL_TRIANGLE_STRIP, faces.size(), GL_UNSIGNED_INT, &faces[0]);

    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
}

----OBJ----

v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
v 1.000000 1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
f 5 1 4
f 5 4 8
f 3 7 8
f 3 8 4
f 2 6 3
f 6 7 3
f 1 5 2
f 5 6 2
f 5 8 6
f 8 7 6
f 1 2 3
f 1 3 4

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    在您的情况下,您根本不需要绑定缓冲区,因为您将缓冲区的索引直接发送到 glColorPointer()

    将其视为将指向缓冲区的指针直接发送到 OpenGL 以进行读取。您可以创建更多颜色缓冲区并简单地更改您的glColorPointer()

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color2);
    //...
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, color3);
    

    或者,您可以将所有颜色放在一个称为颜色的缓冲区中,然后简单地传递正确的偏移量。假设您可以在一个缓冲区中有 72 个用于三种颜色的组件。

    glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[0]);
    //...
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[24]);
    //...
    glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color[48]);
    

    如果你像这样传递一个空指针,你只需要绑定缓冲区

    //setup your array buffer
    GLuint colorBuffID;
    glGenBuffers(1, &colorBuffID);
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffID);
    glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(unsigned char), color1, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    //...
    //use your array buffer
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffID);
    glColorPointer( 3, GL_UNSIGNED_BYTE, 0, (const void*)( 0 ) );
    // draw the quad
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    

    如果一个非零命名缓冲区对象绑定到 GL_ARRAY_BUFFER 指定颜色数组时的目标(参见 glBindBuffer),指针为 被视为缓冲区对象数据存储中的字节偏移量。还, 缓冲区对象绑定 (GL_ARRAY_BUFFER_BINDING) 保存为颜色 顶点数组客户端状态 (GL_COLOR_ARRAY_BUFFER_BINDING)。

    参考https://www.opengl.org/sdk/docs/man2/xhtml/glColorPointer.xml

    【讨论】:

    • 我试图削弱每个人脸的颜色数组,但它覆盖了以前的数组,我做错了什么(见更新部分)?
    • 你需要设置颜色指针然后绘制,然后设置下一个然后绘制。根据您的代码,颜色指针将始终拥有您最新的数组。按照设置数组1然后绘制,然后设置数组2并绘制等等。
    • @Alasdairaryan 还阻止你每次都画同一张脸吗? &amp;faces[0]
    • 嗯,是的,我应该将它们分开以匹配颜色数组吗?
    • 您的代码实际上绘制了 4 次立方体,但仅在您的 faces 数组中将颜色应用于第一个面。因为你所有的脸都在一个数组中,所以把你所有的颜色都放在一个数组中,也可以匹配大小并绘制一次。
    猜你喜欢
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2012-05-27
    相关资源
    最近更新 更多