Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在opengl中创建对象的正确方法?_Opengl_Glut_Vertex - Fatal编程技术网

在opengl中创建对象的正确方法?

在opengl中创建对象的正确方法?,opengl,glut,vertex,Opengl,Glut,Vertex,我对opengl真的很陌生,现在我正在学习基础知识。我有一个高层次的问题。 如果我想创建一个对象,比如一列,所有选项是什么 从任何外部程序(如3DStudio)导入3D网格,并将其加载到opengl中 使用glVertex3f创建6个多边形 超负荷呼叫?(我见过glutSolidCube,但与glutSolidColumn完全不同) 我的问题是: A)还有其他方法吗? B) 如果不使用3DStudio网格,在opengl中创建普通对象/动画对象的正确方法是什么? C) 此代码在2中创建列是否正确

我对opengl真的很陌生,现在我正在学习基础知识。我有一个高层次的问题。 如果我想创建一个对象,比如一列,所有选项是什么

  • 从任何外部程序(如3DStudio)导入3D网格,并将其加载到opengl中
  • 使用glVertex3f创建6个多边形
  • 超负荷呼叫?(我见过glutSolidCube,但与glutSolidColumn完全不同)
  • 我的问题是:

    A)还有其他方法吗?

    B) 如果不使用3DStudio网格,在opengl中创建普通对象/动画对象的正确方法是什么?

    C) 此代码在2中创建列是否正确?(如果正确,我将尝试使用x、y、z变量对其进行参数化,以便为具有给定高度的给定地砖创建列)


    渲染对象只有一种方法,有几种方法。一种方法是为对象的每个(可见)面描述多边形

    在OpenGL 1.x下,这意味着
    glBegin
    glVertex
    glEnd

    在OpenGL2.x下,这意味着
    glvertexinter
    glDrawArrays
    (但1.x方式仍然有效)

    在OpenGL 3.x下,这意味着创建顶点缓冲区对象、绑定它和
    glDrawArrays
    (1.x和2.x方法仅在兼容模式下工作)


    辅助函数(如
    glutSolidCube
    或用于加载模型网格的库)在内部使用这些相同的方法。

    渲染对象的方法只有一种,但也有几种。一种方法是为对象的每个(可见)面描述多边形

    在OpenGL 1.x下,这意味着
    glBegin
    glVertex
    glEnd

    在OpenGL2.x下,这意味着
    glvertexinter
    glDrawArrays
    (但1.x方式仍然有效)

    在OpenGL 3.x下,这意味着创建顶点缓冲区对象、绑定它和
    glDrawArrays
    (1.x和2.x方法仅在兼容模式下工作)


    辅助函数(如
    glutSolidCube
    或用于加载模型网格的库)在内部使用这些相同的方法。

    这取决于正确的定义。逐一回答:

  • 这将是最正常的方式;但是OpenGL只是一个渲染库,由您提供代码来加载您感兴趣的文件格式
  • glVertex3f是一个糟糕的选择;见下文论述
  • GLUT不是OpenGL的一部分,但是是的,有各种各样的第三方库可以为您绘制基本对象。供过于求就是其中之一
  • 回复:glVertex3f和glBegin/glEnd通话。目前,当您学习时,它们是一种简单的方法,可以让您研究渲染管道的其他部分。然而,它们已被弃用且不理想,因此您不希望永久绑定到它们。因此,它们不会在OpenGL ES或WebGL中复制

    CPU和GPU之间的任何通信都会带来成本。在通信中传输的数据越多,成本就越高。然而,由于两个异步和并行设备之间需要临时同步,因此即使是很小的调用也要花费很多


    glBegin/glVertex3f/glEnd因此不好,因为所有数据都位于CPU上,通过大量调用逐段传输到驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和GLDrawArray或glDrawElements(一步执行所有glBegin/glEnd调用的等效操作)。从这里开始,您可以通过顶点数组对象将数据存储在GPU上,而不是CPU上。

    这取决于您对正确数据的定义。逐一回答:

  • 这将是最正常的方式;但是OpenGL只是一个渲染库,由您提供代码来加载您感兴趣的文件格式
  • glVertex3f是一个糟糕的选择;见下文论述
  • GLUT不是OpenGL的一部分,但是是的,有各种各样的第三方库可以为您绘制基本对象。供过于求就是其中之一
  • 回复:glVertex3f和glBegin/glEnd通话。目前,当您学习时,它们是一种简单的方法,可以让您研究渲染管道的其他部分。然而,它们已被弃用且不理想,因此您不希望永久绑定到它们。因此,它们不会在OpenGL ES或WebGL中复制

    CPU和GPU之间的任何通信都会带来成本。在通信中传输的数据越多,成本就越高。然而,由于两个异步和并行设备之间需要临时同步,因此即使是很小的调用也要花费很多


    glBegin/glVertex3f/glEnd因此不好,因为所有数据都位于CPU上,通过大量调用逐段传输到驱动程序。作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和GLDrawArray或glDrawElements(一步执行所有glBegin/glEnd调用的等效操作)。从这里开始,您可以通过顶点数组对象将数据存储在GPU而不是CPU上。

    “逐段传输”。。。你在跟谁开玩笑?在调用
    glFlush
    SwapBuffers
    (或
    glReadPixels
    )之前,驱动程序可以并且通常会对所有内容进行批处理。它在VBOs避免的每一帧上传输数据。顶点阵列可以最大限度地减少用户模式/驱动程序模式转换的次数,但不会影响数据发送到GPU的方式。小型系统上有相当多的驱动程序,它们会在每个glEnd传输,或者具有固定大小的小型内部缓冲区,并且会在其中一个缓冲区满时传输。正如我所说,我正在学习。因此,使用glVertex3f和glBegin/glEnd生成带有参数Z的列是可以学习的
    //Column
    //Wall
    glBegin(GL_POLYGON); 
        glVertex3f(150.0f, 250.0f,50);   // x1, y1 - top-left corner    
        glVertex3f(50.0f, 250.0f,50);   // x2, y1 - top-right corner
        glVertex3f(50.0f, 50.0f,50);        // x2, y2 - bottom-right corner
        glVertex3f(150.0f, 50.0f,50);    // x1, y2 - bottom-left corner
    
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON); 
        glVertex3f(50.0f,  250.0f,0);   // x1, y1 - top-left corner 
        glVertex3f(150.0f, 250.0f,0);  // x2, y1 - top-right corner
        glVertex3f(150.0f, 50.0f,0);   // x2, y2 - bottom-right corner
        glVertex3f(50.0f,  50.0f,0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON);
        glVertex3f(150.0f, 250.0f,0);       // x1, y1 - top-left corner 
        glVertex3f(150.0f, 250.0f,50.0f);   // x2, y1 - top-right corner
        glVertex3f(150.0f, 50.0f,50.0f);        // x2, y2 - bottom-right corner
        glVertex3f(150.0f, 50.0f,0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Wall
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 250.0f,50);       // x1, y1 - top-left corner 
        glVertex3f(50.0f, 250.0f,0);    // x2, y1 - top-right corner
        glVertex3f(50.0f, 50.0f,0);     // x2, y2 - bottom-right corner
        glVertex3f(50.0f, 50.0f,50);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Floor
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 50.0f, 0);        // x1, y1 - top-left corner 
        glVertex3f(50.0f, 50.0f, 50);   // x2, y1 - top-right corner
        glVertex3f(0, 50.0f, 50);       // x2, y2 - bottom-right corner
        glVertex3f(0, 50.0f, 0);    // x1, y2 - bottom-left corner
    glEnd( );
    
    //Ceiling
    glBegin(GL_POLYGON);
        glVertex3f(50.0f, 250.0f, 0);       // x1, y1 - top-left corner 
        glVertex3f(50.0f, 250.0f, 50);  // x2, y1 - top-right corner
        glVertex3f(0, 250.0f, 50);      // x2, y2 - bottom-right corner
        glVertex3f(0, 250.0f, 0);    // x1, y2 - bottom-left corner
    glEnd( );