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

Osc*_*ley 1 opengl glut vertex

我真的很喜欢opengl,现在我正在学习基础知识.我有一个高级别的问题.如果我想创建一个对象,请说一个列是所有选项?

  1. 从任何外部程序(如3DStudio)导入3D网格并将其加载到opengl中
  2. 使用glVertex3f创建6个多边形
  3. 电话过剩?(我见过glutSolidCube,但没有像glutSolidColumn)

我的问题是:

A)还有其他方法吗?

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

C)在2)中创建列是否正确?(如果是的话,我将尝试使用x,y,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( );
Run Code Online (Sandbox Code Playgroud)

Tom*_*mmy 5

这取决于你对正确的定义.逐一回答:

  1. 这将是最正常的方式; 但是OpenGL只是一个渲染库,由你来提供加载你感兴趣的文件格式的代码;
  2. glVertex3f是一个糟糕的选择; 见下面的阐述;
  3. GLUT不是OpenGL的一部分,但是 - 有各种各样的第三方库可以为您绘制原始对象.GLUT就是其中之一.

Re:glVertex3f和glBegin/glEnd调用.目前,当你学习时,它们很好,这是一种让你研究渲染管道其他部分的简单方法.但是,它们已经被弃用并且不是最理想的,因此不是您想要永久约束的东西.因此,它们不会在OpenGL ES或WebGL中复制.

CPU和GPU之间的任何通信都会产生相关成本.您在通信中传输的数据越多,成本就越高.但是,由于两个异步和并行设备之间需要临时同步,即使很小的呼叫也要花费很多.

因此glBegin/glVertex3f/glEnd是错误的,因为所有数据都位于CPU上并通过大量调用逐个传输到驱动程序.作为第一步,您可能希望切换到使用glVertexPointer(一步提供所有顶点数据)和glDrawArrays或glDrawElements(一步执行相当于所有glBegin/glEnd调用).从那里,您可以通过顶点数组对象将数据存储在GPU而不是CPU上.

  • 我想说的是Ben在他说只有一种渲染物体的方法时所做的一点 - 他们会允许你指定你的几何体,所以从这个意义上来说它们是'好'因为它们起作用并且完全正确你想要什么.它们并不是最优的,但是当你学会担心让程序的每一步都达到最佳时,我认为这并不一定有帮助.一旦你有一个完全可行的优化程序,你可能最好学习优化. (2认同)