0

在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();
4

1 回答 1

2

它变得越来越慢的原因是因为使用即时模式渲染的GLU几何网格。GLU

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

这是一个免费的Java反编译器!

于 2013-08-26T11:03:24.063 回答