比顶点更少的颜色

时间:2011-08-29 16:26:41

标签: c++ opengl

在旧的已弃用的OpenGL中,我们可以这样做:

glBegin(...);
   glColor3f(r_1,g_1,b_1);
   glVertex3f(x_1, y_1, z_1);
   glVertex3f(x_2, y_2, z_2);
   ...
   glVertex3f(x_n, y_n, z_n);

   glColor3f(r_2, g_2, b_2);
   glVertex3f(x_(n+1), y_(n+1), z_(n+1));
   glVertex3f(x_(n+2), y_(n+2), z_(n+2));
   ...
   glVertex3f(x_2n, y_2n, z_2n);

   ...
glEnd();

也就是说,我说每个n个连续顶点共享相同的颜色。使用新的和不推荐的OpenGL可以做同样的事情吗?

例如,如果我有一个立方体,则意味着我有36个顶点。如果我希望每个面都有1种颜色,那么每个连续的6个顶点必须共享该颜色。目前我已经为每种颜色人工复制了6次颜色数据,因此顶点数组和颜色数组的大小是相同的。还有其他方法吗?希望我的问题很明确。

1 个答案:

答案 0 :(得分:10)

也许这种伪代码可以为你解决问题:

GLfloat color_state{r,g,b};
GLfloat normal_state{x,y,z};
...

glColor4f(r,g,b,a):
    color_state.r = r
    color_state.g = g
    color_state.b = b
    color_state.a = a

glNormalf(x,y,z):
    normal_state.x = x
    normal_state.y = y
    normal_state.z = z

glVertex3f(x,y,z):
    __glinternal_submit_vertex(
        position = {x,y,z},
        normal = normal_state,
        color = color_state,
        ... );

这就是OpenGL立即在内部工作的方式。顶点之间不共享颜色。从提交的每个顶点的当前状态创建副本。现在,使用“顶点阵列”和“顶点缓冲区对象”会给您带来负担,即可进行正确的数据复制。

相关问题