Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Карта нормалей.


Автор: zMan 11.3.2007, 09:10
Доброго времени суток.

Меня интересует, каким образом создаются карты нормалей для текстур, например, для реализации bump mapping.

Если кто нибудь знает - буду очень благодарен!

Автор: Snowy 11.3.2007, 12:05
Вот список статей по теме:
http://www.google.com/search?hl=ru&inlang=ru&ie=windows-1251&oe=windows-1251&domains=www.gamedev.ru&q=%EA%E0%F0%F2%E0+%ED%EE%F0%EC%E0%EB%E5%E9&btnG=%CF%EE%E8%F1%EA&sitesearch=www.gamedev.ru

Автор: Alexeis 11.3.2007, 15:57
Можно нормаль и вручную посчитать. Для этого нужно всего 3 точки. По ним строятся 2 вектора, с одной общей точкой в конце каждого из векторов. Векторное произведение векторов есть вектор перпендикулярный плоскости образованной первыми двумя. Теперь остается его нормализовать, т.е. координаты разделить на длину вектора.

Вот моя реализация в виде модуля. Функция Normal - возвращает нормаль полученную по 3м точкам. В зависимости от того в каком порядке указаны вершины, получаем либо внешнюю нормаль либо внутреннюю.
Код

unit GLAux;

interface

uses OpenGl;

const
   opengl32 = 'opengl32.dll';

type
 TPoint = Record
            x, y, z : Single
          end;

 TVector = Record
             x,y,z :  Single
           end;

 AUX_RGBImageRec = Record
    sizeX, sizeY : GLint;
    data : array of Byte;
 end;


procedure glTexSubImage2D (target: GLEnum; level, xoffset, yoffset: GLint; width, height: GLsizei; format,
    atype: GLEnum; pixels: Pointer); stdcall; external opengl32;

procedure glGenTextures (n : GLsizei; textures : pGLuint); stdcall; external opengl32;
procedure glBindTexture (target : GLenum; texture : GLuint); stdcall; external opengl32;

Function MakeV(var p1, p2 : TPoint) : TVector;
Function VMultVector(v1, v2 : TVector) : TVector;
Function Normal(var p1, p2, p3 : TPoint) : TVector;

implementation

Function MakeV(var p1, p2 : TPoint) : TVector;
Begin
  Result.x := p2.x - p1.x;
  Result.y := p2.y - p1.y;
  Result.z := p2.z - p1.z;
end;

Function VMultVector(v1, v2 : TVector) : TVector;
Begin
  Result.x := v1.y * v2.z - v2.y * v1.z;
  Result.y := v2.x * v1.z - v1.x * v2.z;
  Result.z := v1.x * v2.y - v2.x * v1.y
end;

Function Normal(var p1, p2, p3 : TPoint) : TVector;
var
  t : Extended;
Begin
  Result := VMultVector(MakeV(P2, P1), MakeV(P3, P1));
  t := 1 / Sqrt(Sqr(Result.x) + Sqr(Result.y) + Sqr(Result.z));
  Result.x := Result.x * t;
  Result.y := Result.y * t;
  Result.z := Result.z * t;
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)