在opengl(java的lwjgl)中,使用glu.Sphere.Sphere()可以非常容易地生成一個球體,但在32×32分辨率的幾十個球體之後,它變得非常緩慢。現在我想使用緩衝區發送頂點+顏色+法線+指數只有一次,並使用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();
是的,你是對的。它逐元素地繪製。將使用,謝謝。你有提示優化元素索引嗎? –
使用頂點索引數組增加性能多嗎? –
使用數組元素,真的取決於模型及其複雜性。雖然對於一個簡單的領域,我只會使用一個常規的VBO並存儲所有內容。 – Vallentin