现在我正在学习OpenGL,我想画一个金字塔,每面都有不同的颜色。我遇到的问题是我似乎只能为顶点指定颜色,而不能为侧面指定颜色。因此每一面都有渐变效果而不是纯色。我怎样才能给我的侧面纯色?
void init_buffer()
{
glGenBuffers(1, &(b.trifan));
glBindBuffer(GL_ARRAY_BUFFER, b.trifan);
GLfloat trifan[6][3] =
{
{0.0, 1.0, 0.0},
{1.0, 0.0, 1.0},
{-1.0, 0.0, 1.0},
{-1.0, 0.0, -1.0},
{1.0, 0.0, -1.0},
{1.0, 0.0, 1.0}
};
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, trifan, GL_STATIC_COPY);
//base of the pyramid as 2 triangles
glGenBuffers(1, &(b.tribase));
glBindBuffer(GL_ARRAY_BUFFER, b.tribase);
GLfloat tribase[4][3] =
{
{1.0, 0.0, -1.0},
{-1.0, 0.0, -1.0},
{1.0, 0.0, 1.0},
{-1.0, 0.0, 1.0}
};
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * 3, tribase, GL_STATIC_COPY);
//colors
glGenBuffers(1, &b.colors);
glBindBuffer(GL_ARRAY_BUFFER, b.colors);
GLfloat colors[6][3] =
{
{1.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 0.0, 0.0},
{1.0, 0.0, 1.0},
{0.5, 0.0, 1.0},
{1.0, 0.0, 0.5},
};
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * 6, colors, GL_STATIC_COPY);
check_errors();
}
...
//Inside my display function
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
{
glBindBuffer(GL_ARRAY_BUFFER, b.trifan);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, b.colors);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
glBindBuffer(GL_ARRAY_BUFFER, b.tribase);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
最佳答案
您可以按照评论中的建议复制每个面的顶点。通过为每个面使用不同的纹理(位图)也可以实现相同的效果,而无需复制顶点。
引用
http://oglsuperbible5.googlecode.com/svn/trunk/Src/Chapter05/Pyramid/Pyramid.cpp
图 https://www.scss.tcd.ie/Michael.Manzke/CS7055/Lab2/SuperBible.4th.Ed.Ch8-9.pdf
注意: super 引用仅在所有面上映射了一个纹理,因此需要编写额外的代码来将不同的纹理映射到不同的面上。
关于c - OpenGL,如何为金字塔的侧面提供纯色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155139/