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