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