gpt4 book ai didi

C++ OpenGL - 顶点颜色

转载 作者:搜寻专家 更新时间:2023-10-31 01:50:33 26 4
gpt4 key购买 nike

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

这是我的代码:

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
}

这是它的样子:

enter image description here

第一个三角形的颜色正确:分别位于“左下角、左上角、右上角”的“红色、绿色、黄色”。

但是,第二个三角形没有正确的颜色:“红、黑、黄(?)”而不是“左下、右下、右上”的“红、绿、黄”。

最初,我想我可能错过了颜色数组中的一些颜色值(因此,它显示为“黑色”,因为“0”是默认值)。然而,我的颜色数组 (Color_Cube[]) 已正确初始化:18 个颜色元素用于我正方形的 6 个顶点。

然而,在对颜色数组进行了一些调整之后,我发现了一些奇怪的事情:

如果我只初始化数组的前 9 个元素,我的方 block 就会变成全黑!

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

为什么全黑了?它应该为第一个三角形着色吗?

然后,如果我初始化数组的最后 9 个元素,则正方形的颜色与之前完全一样(第一个三角形的颜色正确,但第二个三角形的颜色不正确)

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

当我只传递最后 3 个顶点的颜色时,为什么两个三角形都被着色了?是否应该将第一个三角形设为黑色,将第二个三角形设为“红、绿、黄”?

似乎完全忽略了颜色数组的前 9 个元素。为什么???

所以,我被难住了。我想也许我在 glVertexAttribPointer() 的偏移值中犯了一个错误。然而,在仔细检查了这些函数之后,我没有发现任何错误,或者我可能遗漏了什么:

//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);

我没有使用 alpha 值,所以我在顶点数组中总共有 18 个 float (前 9 个 float 是三角形坐标,后 9 个 float 是三角形颜色。顶点数组从位置 0 开始,而颜色数组从位置 36 开始)。

我在这里错过了什么?在过去的两天里,我无法弄清楚哪里出了问题,所以我来这里寻求一些指点和指导。

提前谢谢你。

最佳答案

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

当你指定一个 36 字节的指针时,你是说颜色数据从 Color_Cube 的第 36 个字节开始,这实际上是第 4 种颜色。从这一点开始只有 3 种颜色。这就是为什么一个角是黑色的:那个顶点没有颜色。当你只用前三种颜色初始化 Color_Cube 时,从第 36 个字节开始就没有颜色了,整个方 block 变成黑色。

还有:

Vertices_Cube 有 12 个元素,而 Color_Cube 有 18 个。由于 Vertices_Cube 中只有四个顶点,因此 Color_Cube 中应该只有四种颜色,因为您使用相同的索引缓冲区来引用顶点和颜色缓冲区。

关于C++ OpenGL - 顶点颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14906078/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com