任何人都可以解释以下 opengl 代码吗?

can anyone explain following opengl code?

谁能解释一下函数调用时 glvertex3fv 是如何工作的

GLfloat v[][8][3]={{{-1.5,-1.5,-1.0}, {-1.3,-1.5,-1.0}, {-1.3,-1.3,-1.0}, {-1.5,-1.3,-1.0}, {-1.6,-1.6,1.0}, {-1.4,-1.6,1.0}, {-1.4,-1.4,1.0}, {-1.6,-1.4,1.0}} ,

{{-1.3,-1.5,-1.0}, {-1.1,-1.5,-1.0}, {-1.1,-1.3,-1.0}, {-1.3,-1.3,-1.0}, {-1.4,-1.6,1.0}, {-1.2,-1.6,1.0}, {-1.2,-1.4,1.0}, {-1.4,-1.4,1.0}} ,

{{-1.1,-1.5,-1.0}, {-0.9,-1.5,-1.0}, {-0.9,-1.3,-1.0}, {-1.1,-1.3,-1.0}, {-1.2,-1.6,1.0}, {-1.0,-1.6,1.0}, {-1.0,-1.4,1.0}, {-1.2,-1.4,1.0}} ,

{{-1.5,-1.3,-1.0}, {-1.3,-1.3,-1.0}, {-1.3,-1.1,-1.0}, {-1.5,-1.1,-1.0}, {-1.6,-1.4,1.0}, {-1.4,-1.4,1.0}, {-1.4,-1.2,1.0}, {-1.6,-1.2,1.0}} ,

{{-1.3,-1.3,-1.0}, {-1.1,-1.3,-1.0}, {-1.1,-1.1,-1.0}, {-1.3,-1.1,-1.0}, {-1.4,-1.4,1.0}, {-1.2,-1.4,1.0}, {-1.2,-1.2,1.0}, {-1.4,-1.2,1.0}} ,

{{-1.1,-1.3,-1.0}, {-0.9,-1.3,-1.0}, {-0.9,-1.1,-1.0}, {-1.1,-1.1,-1.0}, {-1.2,-1.4,1.0}, {-1.0,-1.4,1.0}, {-1.0,-1.2,1.0}, {-1.2,-1.2,1.0}} ,

{{-1.5,-1.1,-1.0}, {-1.3,-1.1,-1.0}, {-1.3,-0.9,-1.0}, {-1.5,-0.9,-1.0}, {-1.6,-1.2,1.0}, {-1.4,-1.2,1.0}, {-1.4,-1.0,1.0}, {-1.6,-1.0,1.0}} ,

{{-1.3,-1.1,-1.0}, {-1.1,-1.1,-1.0}, {-1.1,-0.9,-1.0}, {-1.3,-0.9,-1.0}, {-1.4,-1.2,1.0}, {-1.2,-1.2,1.0}, {-1.2,-1.0,1.0}, {-1.4,-1.0,1.0}} ,

{{-1.1,-1.1,-1.0}, {-0.9,-1.1,-1.0}, {-0.9,-0.9,-1.0}, {-1.1,-0.9,-1.0}, {-1.2,-1.2,1.0}, {-1.0,-1.2,1.0}, {-1.0,-1.0,1.0}, {-1.2,-1.0,1.0}}};

GLfloat colors[][3]={{0.0,0.0,0.0}, //black

{1.0,0.0,0.0}, //red

{1.0,1.0,0.0}, //yellow

{0.0,1.0,0.0}, //green

{1.0,0.0,1.0}, //magenta

{0.0,1.0,1.0}}; //cyan ....

void polygon(int a,int b,int c,int d,int i)

{

glBegin(GL_POLYGON);

glColor3fv(colors[a]);

glVertex3fv(v[i][a]); //wt is the meaning of this line

glColor3fv(colors[b]);

glVertex3fv(v[i][b]);

glColor3fv(colors[c]);

glVertex3fv(v[i][c]);

glColor3fv(colors[d]);

glVertex3fv(v[i][d]);

glFlush();

glEnd(); }

void colorcube() {

polygon(0,3,2,1,i); //wt is the meaning of i

polygon(2,3,7,6,i);

polygon(0,4,7,3,i);

polygon(1,2,6,5,i);

polygon(4,5,6,7,i);

polygon(0,1,5,4,i);

}

注意:这是OpenGL即时绘图模式。将近 20(!) 年以来,它一直被弃用并且不鼓励使用。 1996 年,OpenGL-1.1 引入了顶点数组,从那以后,顶点数组比立即模式更受青睐。

glVertex 是旧的、已弃用的 OpenGL 即时绘图模式的一部分。在 glBegin ... glEnd 块之间,任意数量的 glVertex 调用用于将图元绘制到屏幕上;控制绘制对象的属性 在 glVertex 调用之前调用任何属性设置调用 "selects" 然后 glVertex 将发出什么。

一个顶点是为它指定的任何属性+它的位置的全部组合。

先来看单点:

glBegin(GL_POINTS); /* for every call of glVertex draw a point */

/* tip the "pen" into a bucket of bright red */
glColor3f(1,0,0);
/* draw a point, with whatever color currently is set at 1,1,1 */
glVertex3f(1,1,1);

/* let's make the pen blue */
glColor3f(0,0,1);

/* wait, we want it to be green */
glColor3f(0,1,0);
/* only the last value set for an attribute matters.
 * so the point drawn at 0,1,0 will be green */
glVertex3f(0,1,0);

/* and so on */
/* ... */

glEnd();

与绘制 GL_POINTS 到 GL_LINES 或 GL_TRIANGLES 的不同之处在于,您必须发射成对或三元组的顶点才能在屏幕上实际显示一些东西(全部使用 glBegin , glEnd 块)。

现在,您通常会将属性的数据包含在一些更大的内存缓冲区中。在这种情况下,将属性 setter 函数指向该内存而不是传递参数更有意义。这由 OpenGL 调用名称中的字母 'v' 表示。所以

GLfloat red_green_blue[3][3] = {
   {1,0,0},
   {0,1,0},
   {0,0,1}
};

glColor3fv(red_green_blue[0]) /* points to the 'red' part */

这相当于

glColor3f(
    red_green_blue[0][0],
    red_green_blue[0][1],
    red_green_blue[0][2] );

显然 'v' 表格更短且更易于阅读。

现在,在您的代码中,一切都归结为从多维数组中取消引用位置。你想知道 'i' 是什么意思。我建议您在 sheet 纸上用铅笔跟随代码并弄清楚哪些值以何种方式进入 OpenGL。