任何人都可以解释以下 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。
谁能解释一下函数调用时 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。