2013-08-26 53 views
0

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

回答

2

的原因,它越來越慢,是因爲GLU幾何網格使用GLU用來渲染即時模式呈現。

你可以下載一個Java Decompiler和反編譯lwjgl_util.jar,那麼你只要按照glu.Sphere.Sphere()包的路徑,然後你可以查找的draw()方法。看看代碼如何工作,然後基本上創建你自己的方法,而不是使用glVertex等方法。只需將值添加到FloatBuffer,然後創建球體的VBO

Here is a free Java Decompiler!

+0

是的,你是對的。它逐元素地繪製。將使用,謝謝。你有提示優化元素索引嗎? –

+0

使用頂點索引數組增加性能多嗎? –

+0

使用數組元素,真的取決於模型及其複雜性。雖然對於一個簡單的領域,我只會使用一個常規的VBO並存儲所有內容。 – Vallentin