Войти
ПрограммированиеФорумГрафика

cube mapa

#0
20:00, 13 янв 2010

Ребят, вообщем я читаю книгу и там глава о попиксельном дифузном свете через расширение ARB_TEXTURE_ENV_DOT3. Вообщем освещеность пикселя высчитывается по формуле max[(n,l), 0], где n - нормаль пиксела, то бишь граньки, а l - расстояние до источника освещения. Ну я какбы перевел код с си++ на паскаль, все компилируется, но работает не правильно...
В ходе разборки всей программы на куски, я понял, что ВРОДЕ БЫ, ошибка в построении нормирующего куба, короче это кубо мапа, с текстурами, составляющие пикселов которых обозначают координаты до источника света. Както так.
Вообщем вот код построения этой кубо мапы, думаю там гдето ошибка. Пусть опытные ребята пронюхают и выяснят где ошибка...

Function GetCubeVector(side,cubeSize,x,y : Integer) : TVector;
var
 s,t,sc,tc : Single;
 v : TVector;
begin
 s := (x+0.5) / cubeSize;
 t := (y+0.5) / cubeSize;
 sc := 2*s - 1;
 tc := 2*t - 1;
 case side of
  0 : v := Vector(1,-tc,-sc);
  1 : v := Vector(-1,-tc,sc);
  2 : v := Vector(sc,1,tc);
  3 : v := Vector(sc,-1,-tc);
  4 : v := Vector(sc,-tc,1);
  5 : v := Vector(-sc,-tc,-1);
 end;
 Result := V_Normalize(v);
end;
Function CreateNormalizationCubeMap(cubeSize : Integer) : Cardinal;
var
 v : TVector;
 pixels : array of Byte;
 x,y,side : Integer;
 offs : Cardinal;
 s : String;
begin
 SetLength(pixels, 3*cubeSize*CubeSize);
 if Length(pixels) = 0 then Exit;
 glGenTextures(1, @Result);
 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
 glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, Result);
 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 for side := 0 to 5 do
  begin
   for x := 0 to cubeSize-1 do
    for y := 0 to CubeSize-1 do
     begin
      offs := 3 * (y*cubeSize + x);
      v := getCubeVector(side,cubeSize,x,y);
      pixels[offs] := Byte(round(128+127*v.x));
      pixels[offs+1] := Byte(round(128+127*v.y));
      pixels[offs+2] := Byte(round(128+127*v.z));
     end;
   gluBuild2DMipmaps ( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB+side, GL_RGB,
                           cubeSize, cubeSize, GL_RGB, GL_UNSIGNED_BYTE, @pixels );
  end;
 pixels := nil;
 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
end;

Первая функция как раз преобразует из координат пиксела на заданной стороне куба еденичный вектор до источника света. Я если честно еще сам не во всем разобрался, так как не могу читать дальше из-за неполучившизся примеров.
PS Книга Алексея Борескова Расширения OpenGL, глава 8, если чо=)

#1
20:55, 13 янв 2010

> думаю там гдето ошибка
дык ты выведи в файл картинку или на экран, проверь: должно быть похоже на то, что внизу ;)

на первый взгляд все правильно, однако:
незнаю как там в дельфях, но в С надо делать приведение типов

s := (x+0.5) / cubeSize;
t := (y+0.5) / cubeSize;

s = ((float) x+0.5f) / (float) cubeSize;
t = ((float) y+0.5f) / (float) cubeSize;

мож готовая прокатит? :)
Изображение

A function that produces a cube normalization map named CreateNormalizationCubeMap() can be found in the NVIDIA EffectsBrowser/Cg Browser source in the file nvtex.cpp.

#2
11:39, 14 янв 2010

Че там под картинками написано???

#3
11:43, 14 янв 2010

Написано что в NVIDIA SDK в файле nvtex.cpp есть функция CreateNormalizationCubeMap(), которая это делает

#4
13:08, 14 янв 2010

А можно ей посмотрерть?? Выложите пожалуйсто, здесь, а то я впринципе не раз не видел NVIDEA sdk

#5
14:25, 14 янв 2010

Ребят, стал сохранять все грани кубемапа в массив GL_TEXTURE_2D и потом просто цикликом рисовать 6 квадратов и поочередно накладывать на них полученные текстурки из этого массива. Ну вообщем ничего хорошего. 1) Все они одинаковые и такое ощущени что в верхней части текстуры просто рандомно пиксели создавалиь, а внижней какието полоски сиреневые с красным. Вообще не понятно... Ну готовая может и покатит, но всеже хочется разобраться и создавать её процедурно...

#6
14:41, 14 янв 2010

Эх, ребятушки, нашел я ошибку=))
Ошибка как всегда не там где я её искал, ну точнее в создании кубемапа, но далеко не в формулах...
Просто при использовании
gluBuild2DMipmaps ( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB+side, GL_RGB,
                          cubeSize, cubeSize, GL_RGB, GL_UNSIGNED_BYTE, @pixels );
нужно передавать не ссылку на массив пикселей, а ссылку на первый элемент массива с пикселями=)) Я кабы это знаю, просто процедурку в торопях писал вот и ошибочка.=))
Ну всеравно, ребят, спасибо что хоть ответили и предложили хоть чтото.
Можно закрыть тему.

ПрограммированиеФорумГрафика

Тема в архиве.