C++ C++;OpenGL-顶点颜色

C++ C++;OpenGL-顶点颜色,c++,opengl,C++,Opengl,我正在玩OpenGL顶点颜色。基本上,我画了一个由两个三角形组成的正方形。我能够按照我想要的方式给第一个三角形上色,但是第二个三角形没有按照我期望的方式上色。在过去的两天里,我一直在研究这个问题,但我无法解决它,所以我在这里寻求一些指导 这是我的密码: void Construct_Cube() { //--------------------- //Init cube's vertices float Vertices_Temp[] = {

我正在玩OpenGL顶点颜色。基本上,我画了一个由两个三角形组成的正方形。我能够按照我想要的方式给第一个三角形上色,但是第二个三角形没有按照我期望的方式上色。在过去的两天里,我一直在研究这个问题,但我无法解决它,所以我在这里寻求一些指导

这是我的密码:

void Construct_Cube()
{
    //---------------------
    //Init cube's vertices

    float Vertices_Temp[] = 
    {
        0, 0, 0, //bottom-left corner
        0, 1, 0, //top-left
        1, 1, 0, //top-right
        1, 0, 0  //bottom-right
    };

    for(int i = 0; i < (sizeof(Vertices_Temp) / sizeof(GLfloat)); i++)
    {
        Vertices_Cube.push_back(Vertices_Temp[i]);
    }

    //---------------------------
    //Init cube's draw order list
    int tempOrder[] = { 0, 1, 2, 0, 3, 2};

    for(int i = 0; i < (sizeof(tempOrder) / sizeof(int)); i++)
    {
        drawOrder_Cube.push_back(tempOrder[i]);
    }

    //------------------
    //Init cube's color
    Color_Cube.resize(18);

    //Color of each triangle (Red-Green-Yellow)
    for(int i = 0; i < 18;)
    {
        Color_Cube[i++] = 1.0f;
        Color_Cube[i++] = 0.0f;
        Color_Cube[i++] = 0.0f;

        Color_Cube[i++] = 0.0f;
        Color_Cube[i++] = 1.0f;
        Color_Cube[i++] = 0.0f;

        Color_Cube[i++] = 1.0f;
        Color_Cube[i++] = 1.0f;
        Color_Cube[i++] = 0.0f;
    }

    glGenVertexArrays(1, &VAO_Cube);
    glBindVertexArray(VAO_Cube);

    //-------------------
    //Buffer for vertices
    glGenBuffers(1, &VBO_Cube_Vertices);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_Cube_Vertices);
    glEnableVertexAttribArray(0);

    //Passing CartesianSys coord data into the ARRAY_BUFFER
    glBufferData(GL_ARRAY_BUFFER, (Vertices_Cube.size())*sizeof(float), &Vertices_Cube[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); //size = 3 (X,Y,Z)

    //----------------
    //Buffer for color
    glGenBuffers(1, &VBO_Cube_Color);
    glBindBuffer(GL_ARRAY_BUFFER, VBO_Cube_Color);
    glEnableVertexAttribArray(1);

    glBufferData(GL_ARRAY_BUFFER, (Color_Cube.size())*sizeof(float), &Color_Cube[0], GL_STATIC_DRAW);
    glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, (void *)36); //size = 3 (R,G,B)

    glBindVertexArray(0); //Unbind VAO
}

void draw()
{
    glBindVertexArray(VAO_Cube); //Bind VAO
    glDrawElements(GL_TRIANGLES, drawOrder_Cube.size(), GL_UNSIGNED_INT, &drawOrder_Cube[0]);
    glBindVertexArray(0); //Unbind VAO
}
我没有使用alpha值,所以顶点数组中总共有18个浮点(前9个浮点是三角形坐标,后9个浮点是三角形颜色。顶点数组从位置0开始,而颜色数组从位置36开始)

我错过了什么?在过去的两天里,我不知道哪里出了问题,所以我来这里寻求一些指示和指导


提前感谢。

当您为颜色调用GLVERTEXATTRIBPOINT时,最后一个参数(指针)在您的情况下应为0。指针将是从颜色缓冲区(不是顶点数组)开始到有效数据开始的偏移量(以字节为单位)。Color_Cube中的颜色从字节0开始

指定36字节的指针时,表示颜色数据从color_Cube的第36个字节开始,这实际上是第4个颜色。从这一点开始只有3种颜色。这就是为什么一个角是黑色的:该顶点没有颜色。当您仅使用前三种颜色初始化Color_Cube时,从第36个字节开始不再有颜色,整个正方形变为黑色

此外:

顶点\u立方体有12个元素,而颜色\u立方体有18个元素。
因为在“顶点”立方体中只有四个顶点,所以在“颜色”立方体中应该只有四种颜色,因为您使用相同的索引缓冲区来引用顶点和颜色缓冲区。

我对颜色属性和偏移量有点困惑,但请尝试将
临时器更改为
{0,1,2,3,0,2}
。你做的每件事都是我从未见过的。递增for循环中的迭代器。分离属性数组,而不是使用跨步来交叉指向数据+1关于复杂性。你正在强奸
for
循环。。。它不会执行任何操作,可能只会导致错误(例如,如果您曾经意外地移除身体的一条线),宾果!它工作得很好。非常感谢你。我现在明白了。
for(int i = 0; i < 9;)
{
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;
    Color_Cube[i++] = 0.0f;

    Color_Cube[i++] = 0.0f;
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;

    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;
}
for(int i = 9; i < 18;)
{
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;
    Color_Cube[i++] = 0.0f;

    Color_Cube[i++] = 0.0f;
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;

    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 1.0f;
    Color_Cube[i++] = 0.0f;
}
//Buffer for vertices
glEnableVertexAttribArray(0);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);

//Buffer for color
glEnableVertexAttribArray(1);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, (void *)36);