|
26.11.2013, 14:13
|
#61
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
на плоскости и без TBN сойдёт.
покажи на флипанутом кубе, затекстурь все стены одной и той же нормалкой и таскай там лайт повсюду.
|
(Offline)
|
|
26.11.2013, 14:35
|
#62
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Сообщение от Mr_F_
на плоскости и без TBN сойдёт.
покажи на флипанутом кубе, затекстурь все стены одной и той же нормалкой и таскай там лайт повсюду.
|
это уже с tbn
вот куб, что-то здесь не так
http://rutube.ru/video/e7c98c126c668...9ebc1ed97240d/
|
(Offline)
|
|
26.11.2013, 15:21
|
#63
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
да, выглядит сломано, отрисовывай в какой позиции находится лайт, шариком или спрайтом
|
(Offline)
|
|
26.11.2013, 16:07
|
#64
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Сообщение от Mr_F_
да, выглядит сломано, отрисовывай в какой позиции находится лайт, шариком или спрайтом
|
есть норм шейдер?
|
(Offline)
|
|
26.11.2013, 16:35
|
#65
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
я делаю так
vec3 normtex = texture2D(normalmap, IN_TexCoords).xyz;
normtex = normtex*2.0-1.0;
mat3 TBN = mat3(normalize(IN_Tangent), normalize(IN_Binormal), normalize(IN_Normal));
normal = TBN * normtex;
далее normal это нормаль в ворлдспейсе с учётом нормалмапы.
некоторые любят переводить лайты в тангент спейс, но мне кажется так удобнее.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
26.11.2013, 18:05
|
#66
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Ребят посмотрите мой шейдер
const std::string NORMAL_VS = "attribute vec4 POSITION;\n" "attribute vec3 NORMAL;\n" "attribute vec2 TEXCOORD;\n" "attribute vec3 TANGENT;\n" "attribute vec3 BINORMAL;\n" "uniform float LIGHTS_COUNT;\n" "uniform mat4 PROJ_MATRIX;\n" "uniform mat4 VIEW_MATRIX;\n" "uniform mat4 MODEL_MATRIX;\n" "uniform mat3 NORMAL_MATRIX;\n" "uniform vec3 LIGHTS_POSITION[8];\n" "varying vec2 texcoord;\n" "varying vec3 vVaryingLightDir[8];\n" "varying vec3 vVaryingNormal;\n" "void main(){\n" " mat3 rotmat = mat3(TANGENT,BINORMAL,NORMAL);\n" " rotmat = NORMAL_MATRIX * rotmat;\n" " vVaryingNormal = NORMAL;\n" " vec4 vPosition4 = MODEL_MATRIX * POSITION;\n" " vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n" " for (int i = 0; i < 8; ++i){\n" " if (int(LIGHTS_COUNT) <= i) break;\n" " vVaryingLightDir[i] = -normalize(LIGHTS_POSITION[i] - vPosition3);\n" " vVaryingLightDir[i] = rotmat * vVaryingLightDir[i];\n" " }\n" " gl_Position = PROJ_MATRIX * VIEW_MATRIX * MODEL_MATRIX * POSITION;\n" " texcoord = TEXCOORD;\n" "}"; const std::string NORMAL_FS = "uniform sampler2D TEXTURE_DIFFUSE;\n" "uniform sampler2D TEXTURE_NORMAL;\n" "uniform vec4 LIGHTS_AMBIENT[8];\n" "uniform vec4 LIGHTS_DIFFUSE[8];\n" "uniform vec4 LIGHTS_SPECULAR[8];\n" "uniform float LIGHTS_COUNT;\n" "varying vec2 texcoord;\n" "varying vec3 vVaryingLightDir[8];\n" "varying vec3 vVaryingNormal;\n" "void main(){\n" " gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\n" " float maxVariance = 10.0;\n" " float minVariance = maxVariance / 2.0;\n" " vec3 normalAdjusted = vVaryingNormal + normalize(texture2D(TEXTURE_NORMAL, texcoord.st).rgb * maxVariance - minVariance);\n" " vec3 texDiff = texture2D(TEXTURE_DIFFUSE, texcoord.st).rgb;\n" " int lc = int(LIGHTS_COUNT);\n" " for (int i = 0; i < lc; ++i){\n" " float diffuseIntensity = max(0.0, dot(normalize(normalAdjusted), normalize(vVaryingLightDir[i])));\n" " vec3 colour = (diffuseIntensity * LIGHTS_DIFFUSE[i].rgb) * texDiff + LIGHTS_AMBIENT[i].rgb;\n" " vec4 vFragColour = vec4(colour, 1.0);\n" " vec3 vReflection = normalize(reflect(-normalize(normalAdjusted), normalize(vVaryingLightDir[i])));\n" " float specularIntensity = max(0.0, dot(normalize(normalAdjusted), vReflection));\n" " if(diffuseIntensity > 0.98)\n" " {\n" " float fSpec = pow(specularIntensity, 64.0);\n" " vFragColour.rgb += vec3(fSpec * LIGHTS_SPECULAR[i].rgb);\n" " }\n" " gl_FragColor += vFragColour;\n" " }\n" " gl_FragColor.a = 1.0;\n" "}";
вроде все правильно
|
(Offline)
|
|
26.11.2013, 18:41
|
#67
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
rotmat = NORMAL_MATRIX * rotmat;\n"
|
что это?
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;\n"
|
в модель матрице не должно быть по идее ничего такого, что требовало бы потом этого деления.
for (int i = 0; i < 8; ++i){\n"
" if (int(LIGHTS_COUNT) <= i) break;\n"
" vVaryingLightDir[i] = -normalize(LIGHTS_POSITION[i] - vPosition3);\n"
" vVaryingLightDir[i] = rotmat * vVaryingLightDir[i];\n"
|
это намного лучше во фрагментном считать
vec3 normalAdjusted = vVaryingNormal + normalize(texture2D(TEXTURE_NORMAL, texcoord.st).rgb * maxVariance - minVariance);\n"
|
ты зачем-то прибавляешь нормалмапу к вертексной ворлд нормали, забивая на TBN
--
а, я понял, ты переводишь направление от лайтов в тангент спейс в VS, все равно непонятно что за прибавление вертексной нормали в PS тогда, плюс направление от поинтлайтов считать в VS на сцене из кубов это жесть по-любому.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.11.2013, 19:07
|
#68
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Я не сильно силен в такой математике, что то как то по формулам набросал. Мажешь помочь с этими шейдерами? Что как правильно написать
|
(Offline)
|
|
26.11.2013, 22:16
|
#69
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: Clear Engine (Понятный движок)
лучше помоги ему с математикой
|
(Offline)
|
|
27.11.2013, 00:06
|
#70
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
перепробывал кучу готовых шейдеров, вообще неадекватные результаты. ЧЯДНТ
|
(Offline)
|
|
27.11.2013, 00:46
|
#71
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Clear Engine (Понятный движок)
TBN!
|
(Offline)
|
|
27.11.2013, 00:48
|
#72
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
лучше скажи в теории как ты понимаешь как работает бамп.
я тебя поправлю где надо. без понимания всё время придётся копипастить.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.11.2013, 00:49
|
#73
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Сообщение от moka
TBN!
|
да блин, естественно я юзаю tbn. Ребят, у вас есть проверенный временем шейдер?
|
(Offline)
|
|
27.11.2013, 00:51
|
#74
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Clear Engine (Понятный движок)
Сообщение от Mr_F_
лучше скажи в теории как ты понимаешь как работает бамп.
я тебя поправлю где надо. без понимания всё время придётся копипастить.
|
я понимаю это так:
мы накладываем обычное попиксельное освещение, но нормали берем из текстуры, учитывая нормаль самого объекта и матрицы нормали... как это все между собой связывается в коде, я понятия не имею, да и не видел по этому поводу простых для понимания мануалов
|
(Offline)
|
|
27.11.2013, 01:05
|
#75
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Clear Engine (Понятный движок)
учитывая нормаль самого объекта и матрицы нормали
|
не так.
Нормалмапа - находится в пространстве TBN, которое образуется одной матрицей, сделанной из тангента, бинормали и нормали. Эти три хреновины - тупо 3 перпендикулярные друг другу вектора.
Каждый пиксель нормалмапы это вектор в их системе координат.
Синий канал это насколько вектор повёрнут в сторону нормали, красный и зеленый - в стороны других осей (в каждом пикселе).
Только щас заметил, ты не декодируешь сам вектор из карты то. Нужно всегда делать nmap = nmap*2-1, чтобы из диапазона [0;1] перевести каждый компонент вектора нормалмапы в диапазон [-1;1].
Ну вот, короче тебе надо соорудить TBN матрицу из трёх векторов и умножить нормалмапу на неё - тогда ты переведёшь нормалку в ворлдспейс, или (как у тебя было) умножить ворлдспейсовые вектора направлений света на неё (в другой последовательности), тогда ты переведёшь их в пространство нормалки и осветишь там.
В блице TFormNormal видел? Ну вот, там были локальные координаты и глобальные, а тут локальные координаты задаются TBN матрицей на каждый вертекс/фрагмент и надо тформить чтобы всё оказалось в одном пространстве в результате.
Я бы по-прежнему рекомендовал перевести нормалку в ворлдспейс, потому что это 1 умножение матрицы против кучи умножений на каждый лайт в цикле.
Направление света от поинт лайтов надо считать в PS! Если у тебя не супер тесселлированная геометрия. Повертексно это слишком убого и ты вообще не поймёшь правильно или неправильно.
|
(Offline)
|
|
Эти 5 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:02.
|