颜色比顶点少

Fewer Colors Than Vertices

本文关键字:顶点 颜色      更新时间:2023-10-16

在旧的已弃用的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个顶点。如果我想让每个面都有一种颜色,那么每个连续的6个顶点必须共享这种颜色。目前,我人为地为每种颜色复制了6次颜色数据,以便顶点数组和颜色数组的大小相同。还有别的办法吗?希望我的问题很清楚。

也许这种伪代码能帮你弄清楚:

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 immediate的内部工作方式。顶点之间不共享颜色。为每个提交的顶点从当前状态创建一个副本。现在,有了顶点数组和顶点缓冲对象,执行正确的数据复制的重担就落在您身上了。