2013-08-26 6 views
0

В opengl (lwjgl для java) использование glu.Sphere.Sphere() может очень легко сгенерировать сферу, но после нескольких десятков сфер с разрешением 32x32 она становится очень медленной. Теперь я думаю о том, чтобы использовать буферы для отправки вершин + цветов + нормалей + индексов только один раз и изменять их с помощью opencl.Создание сферы вручную

Вопрос: Если я беру начало как (0,0,0) в качестве центра сферы, могу ли я выбрать нормаль, равную ее вершине?

Пример: Северный полюс сферы - это вершина = (0,1,0), так может ли его нормаль поверхности (0,1,0) снова? Можем ли мы сделать то же самое для всех вершин? Как насчет порядка элементов массива, если мы можем оптимизировать его? Угадание треугольной вершины может использоваться многими соседними треугольниками. Я начинаю, поэтому мне нужен некоторый указатель на использование эффективной функции drawElementArray и генерации индекса.

Примечание: Im сохраняет мой процессор на частоте 1400 МГц, поэтому он не может обрабатывать много вычислений на стороне хоста, а opengl не принимает многопоточный рисунок сфер.

Следуя предложению Валентина, я открылся внутри 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

Ну, используя Array Elements, это действительно зависит от модели и ее сложности. Хотя для простой сферы я бы просто использовал обычный VBO и сохранил все. – Vallentin

Смежные вопросы