【问题标题】:can anyone explain following opengl code?任何人都可以解释以下opengl代码吗?
【发布时间】:2015-05-24 15:48:25
【问题描述】:

谁能解释一下函数调用时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 visual-c++ graphics


    【解决方案1】:

    注意:这是 OpenGL 即时绘图模式。它已被弃用和不鼓励使用近 20(!)年。 1996 年,OpenGL-1.1 引入了顶点数组,从那时起它就比立即模式更受欢迎。

    glVertex 是旧的、已弃用的 OpenGL 即时绘图模式的一部分。在 glBegin ... glEnd 块之间,任意数量的 glVertex 调用用于将图元绘制到屏幕上;控制所绘制内容的属性 glVertex 调用之前的任何属性设置调用“选择”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 块)。

    现在,您通常会将属性数据包含在一些较大的内存缓冲区中。在这种情况下,将属性设置器函数指向该内存而不是传递参数更有意义。这由 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' 形式更短且更易于阅读。

    现在,在您的代码中,这一切都归结为从多维数组中取消引用位置。你想知道“我”是什么意思。我建议你用铅笔在一张纸上按照代码进行操作,然后弄清楚哪些值会以何种方式进入 OpenGL。

    【讨论】:

    • 我试图获取 'i' 的值,但我无法请你帮我看看你可以在github link找到代码
    • @user2350539:Arrrrgh,谁写了这堆热气腾腾的废话? i 是一个全局变量,被滥用以将参数传递给被调用的子例程(=函数)。应该为此使用普通参数。无论如何,在第 246 行和第 299 行中,您可以找到一个迭代全局变量 i 并在其上调用 colorcube() 的 for 循环——为什么 i 不只是作为参数传递,这超出了我的理解。
    • @user2350539:这里有一个建议(也是为了提高你的技能):在第 10 行定义了一组全局变量,用于将值传递给子程序;用相关函数的局部范围内的变量替换它们,并在需要时将它们的值作为参数传递。
    • @user2350539:所有在 reshape 处理程序中对display 的调用,以及在绘图代码中每隔一行左右对glFlush 的调用都是完全多余的。
    • @user2350539:在关闭以glBegin 开头的立即模式绘图块以外的任何其他地方调用glEnd 无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多