手动生成球体

时间:2013-08-26 10:51:10

标签: opengl geometry lwjgl

在opengl(java的lwjgl)中,使用glu.Sphere.Sphere()可以很容易地生成一个球体但是经过几十个32x32分辨率的球体后,它变得非常慢。现在我想使用缓冲区只发送一次顶点+颜色+法线+索引一次并使用opencl更改它们。

问题:如果我将原点作为(0,0,0)作为球体的中心,我可以选择一个等于其顶点的法线吗?

示例:球体的北极是顶点=(0,1,0),那么它的表面法线可以再次为(0,1,0)吗?我们可以为所有顶点做同样的事情吗?如果我们可以优化元素数组顺序呢?猜测三角形顶点可以被许多相邻三角形使用。我是一个初学者所以我需要一些指针来使用高效的drawElementArray函数和索引数组生成。

注意:我将我的cpu保持在1400MHz,因此无法在主机端处理大量计算,而opengl不接受球体的多线程绘制。

按照Valentin的建议,我打开了glu内部,发现这是逐个元素的元素。将它用于缓冲区生成。

if (this.drawStyle == 100010)
        {
          GL11.glBegin(0);
          if (normals)
            GL11.glNormal3f(0.0F, 0.0F, nsign);
          GL11.glVertex3f(0.0F, 0.0F, radius);
          if (normals)
            GL11.glNormal3f(0.0F, 0.0F, -nsign);
          GL11.glVertex3f(0.0F, 0.0F, -radius);

          for (int i = 1; i < stacks - 1; i++) {
            float rho = i * drho;
            for (int j = 0; j < slices; j++) {
              float theta = j * dtheta;
              float x = cos(theta) * sin(rho);
              float y = sin(theta) * sin(rho);
              float z = cos(rho);
              if (normals)
                GL11.glNormal3f(x * nsign, y * nsign, z * nsign);
              GL11.glVertex3f(x * radius, y * radius, z * radius);
            }
          }
          GL11.glEnd();

1 个答案:

答案 0 :(得分:2)

它越来越慢的原因是因为使用GLU渲染的GLU几何网格使用立即模式进行渲染。

您可以下载Java Decompiler并反编译lwjgl_util.jar,然后只需按照glu.Sphere.Sphere()的包路径进行操作即可查找draw()方法。看看代码如何工作,然后基本上创建自己的方法,而不是使用glVertex等方法。只需将值添加到FloatBuffer,然后创建一个VBO的Sphere。

Here is a free Java Decompiler!