Могу ли я рассчитать нормали в GPU? - PullRequest
5 голосов
/ 27 июля 2010

У меня есть приложение opengl, которое загружает DXF и рисует его на экране каждый раз, когда мне нужно вычислить нормали.Есть ли способ рассчитать нормали в графическом процессоре вместо процессора?если да как?

Ответы [ 4 ]

4 голосов
/ 28 июля 2010

Вам придется использовать шейдеры.

Вы можете использовать геометрический шейдер GLSL. Вот версия GLSL для нормалей лица. Для нормалей вершин требуется больше работы, поскольку они должны учитывать соседние вершины.

  • Убедитесь, что ваша графическая карта поддерживает геометрические шейдеры! Используйте, например, GPU Caps Viewer.
  • Вырежьте и вставьте любой учебник, чтобы включить геометрический шейдер в ваше приложение.
  • Шейдер должен выглядеть так:
//glsl shader

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main(void)
{
// Compute per-face normal
    vec4 d1 = gl_PositionIn[1] - gl_PositionIn[0];
    vec4 d2 = gl_PositionIn[2] - gl_PositionIn[0];
    gl_Normal = cross(d1,d2);

// Emit all input vertices
    for(i=0; i< gl_VerticesIn; i++){
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
    EndPrimitive();
}   
4 голосов
/ 28 июля 2010

Вы можете вычислить «плоско-затененные» (по одной нормали на границу) нормали из геометрического шейдера. По одному на каждый треугольник, «на лету», используя перекрестные произведения. Вы не можете генерировать «гладкие» нормали таким образом, потому что GS не имеет информации о соседях.

Если сетка параметрическая (скажем, метаболлы), нормаль можно рассчитать путем выборки нескольких близлежащих значений функций. Это также можно сделать на графическом процессоре.

Вы также можете вычислить нормали в шейдере, если сетка основана на карте высот или чем-то подобном.

ЕСЛИ GPU поддерживает CUDA, OpenCL или что-то подобное, И если он может обрабатывать произвольные массивы данных, то вы, вероятно, также можете вычислять нормали на GPU, используя традиционные методы.

Кроме того, я думаю, что 5 лет назад (или около того) я увидел статью под названием что-то вроде «нормальное сглаживание на GPU» или «нормальное поколение на GPU». На первой странице у него было отражающее многоугольное сердце с плоским оттенком. К сожалению, я не могу найти эту газету, и я не совсем уверен, существует ли она (или где я ее видел). Вы можете найти его (если он существует) в документах GDC, SIGGRAPH, ATI SDK или NVidia SDK.

2 голосов
/ 27 июля 2010

Да, это возможно.Вы хотите узнать о шейдерах в Cg .

Официальная книга .

1 голос
/ 27 июля 2010

Посмотрите на glEnable(GL_AUTO_NORMAL).

...