Ребят, вообщем я читаю книгу и там глава о попиксельном дифузном свете через расширение 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, если чо=)
> думаю там гдето ошибка
дык ты выведи в файл картинку или на экран, проверь: должно быть похоже на то, что внизу ;)
на первый взгляд все правильно, однако:
незнаю как там в дельфях, но в С надо делать приведение типов
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.
Че там под картинками написано???
Написано что в NVIDIA SDK в файле nvtex.cpp есть функция CreateNormalizationCubeMap(), которая это делает
А можно ей посмотрерть?? Выложите пожалуйсто, здесь, а то я впринципе не раз не видел NVIDEA sdk
Ребят, стал сохранять все грани кубемапа в массив GL_TEXTURE_2D и потом просто цикликом рисовать 6 квадратов и поочередно накладывать на них полученные текстурки из этого массива. Ну вообщем ничего хорошего. 1) Все они одинаковые и такое ощущени что в верхней части текстуры просто рандомно пиксели создавалиь, а внижней какието полоски сиреневые с красным. Вообще не понятно... Ну готовая может и покатит, но всеже хочется разобраться и создавать её процедурно...
Эх, ребятушки, нашел я ошибку=))
Ошибка как всегда не там где я её искал, ну точнее в создании кубемапа, но далеко не в формулах...
Просто при использовании
gluBuild2DMipmaps ( GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB+side, GL_RGB,
cubeSize, cubeSize, GL_RGB, GL_UNSIGNED_BYTE, @pixels );
нужно передавать не ссылку на массив пикселей, а ссылку на первый элемент массива с пикселями=)) Я кабы это знаю, просто процедурку в торопях писал вот и ошибочка.=))
Ну всеравно, ребят, спасибо что хоть ответили и предложили хоть чтото.
Можно закрыть тему.
Тема в архиве.