|
Xors3D Графический движок с поддержкой DirectX9 |
19.11.2011, 01:41
|
#31
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Вот так я в хорсе пытаюсь передать в шейдер матрицу от камеры с которой отрисована текстура с расстоянием от света до поверхности.
xSetEffectMatrix(entity,"v_proj",xGetViewProjMatri x(shadecam),0);
в шейдере я добавил:
В выходных данных вершинного
float2 shtexcoors : TEXCOORD4;
а матрица:
float4x4 v_proj;
потом я записываю их так в вершинном
float4 pos=mul(input.position, v_proj);
output.shtexcoors = float2((pos.x/pos.w+1)/2,(pos.y/pos.w-1)/2);
и наконец в пиксельном:
float4 shade=tex2D(shadeSampler,input.shtexcoors*0.25);
float4 color=0.75*shade+0.25*(diffuse * lit * lightColor+diffuse*ambient);
return color;
Я как бы добавляю 75% к обычному цвету от спроецированной текстуры.
Но оно мне рисует на всей поверхности только одну точку из текстуры.
Хотя когда я использую передаваемую хорсом матрицу все происходит как надо.
float4 pos=mul(input.position, matrixWorldViewProj);
Как мне передать из хорса в шейдер matrixWorldViewProj другой камеры?
|
(Offline)
|
|
19.11.2011, 02:36
|
#32
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
xSetEffectMatrix(entity,"v_proj",xGetViewProjMatri x(shadecam),0);
|
каждый кадр вызываешь, надеюсь?
|
(Offline)
|
|
19.11.2011, 03:07
|
#33
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Да.
На глаз получается, что текстурные координаты не зависят от позиции пикселя, я так понимаю это от того, что вместо матрицы из хорса пришло ничто, нули и поэтому выбирается только одна точка. Т.е. косяк скорей всего в моем коде внутри хорса, но как правильно это сделать я не знаю.
|
(Offline)
|
|
19.11.2011, 03:42
|
#34
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
хз, я юзал xGetViewProjMatrix чтобы проецировать декали из камер, так что в ксорсе в этом плане всё должно быть ок.
--
а, хотя нет.
я юзал
castermatrix=xGetProjectionMatrix(castercamera)
castermatrix2=xGetViewMatrix(castercamera)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2012, 16:25
|
#35
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Захотелось мне свой бамп сочинить.
Вот есть у меня нормаль. И есть нормаль из нормалмапы
vec3 norm = normalize(texture2D(texture1,fragmentuv).xyz*2-1.0);
Как мне сбацать из нормали матрицу поворота на которую умножить надо нормаль из нормалмапы?
|
(Offline)
|
|
25.08.2012, 17:20
|
#36
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
Как мне сбацать из нормали матрицу поворота
|
нормально никак, для этого препросчитывают ещё две оси (tangent, binormal) в зависимости от UV и всякой шняги. если у тебя какая-нибудь плоскость воды, то можно легко сочинить эти оси, а на произвольном меше только препросчёт.
ну есть бомжарский способ через ddx/ddy, но качество будет страдать.
|
(Offline)
|
|
25.08.2012, 17:20
|
#37
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Нубошоу по шейдерам.
зачем?
если у тебя нормалкарта в объектспейсе, то просто бери значение нормали из нее.
если у тебя нормалкарта в тангентспейсе, то тебе нужно перевести источник света в тангент спейс как то так:
"vec3 n = normalize(normalmatrix * normal);\n"
"vec3 t = normalize(normalmatrix * tangent);\n"
"vec3 b = cross(n, t);\n"
"vec3 vVertex = vec3(model * vec4(position,1));\n"
"vec3 tmpVec = lightpos - vVertex;\n"
"lightVec.x = dot(tmpVec, t);\n"
"lightVec.y = dot(tmpVec, b);\n"
"lightVec.z = dot(tmpVec, n);\n"
ну есть бомжарский способ через ddx/ddy, но качество будет страдать.
|
а можно поподробнее?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.08.2012, 17:23
|
#38
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Нубошоу по шейдерам.
если у тебя нормалкарта в тангентспейсе, то тебе нужно перевести источник света в тангент спейс как то так:
|
необяз, можно и тангент-нормалмапу переводить в обжектспейс, а потом применять N лайтов и прочие эффекты в обычном интуитивном обжектспейсе. я так делаю, но тут уж кому как нравится.
--
ddx/ddy позволяют примерно узнать, насколько изменится переменная на экране на следующем пикселе по x/y.
для нормали результат может выглядеть так: http://www.gamedev.net/topic/599518-directx-ddxddy/
ну и собсно это можно юзать в некоторых случаях в качве TBN, имея только N, но гранёность будет.
есть на основе этого ещё более хитрозавёрнутый метод бампа через одноканальную карту высот и без TBN и без гранёности (но вблизи артефактово или медленно это фиксить):
http://jbit.net/~sparky/sfgrad_bump/mm_sfgrad_bump.pdf
http://www.rorydriscoll.com/2012/01/11/derivative-maps/
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
25.08.2012, 18:47
|
#39
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Нубошоу по шейдерам.
Хочу на свой меш ландшафта бамп и потом тесселяцию со смещением по картам сделать. Так что кроме нормали и текстурных координат у меня нет ничего и вообще слов то таких про тангентспейс я не знаю )
Но ведь нормаль можно смотреть как
(cos кИкс * sin кЗед; соs кИгрек * sin кЗед; cos кЗед)
А карта у меня сделана для отклонения нормали (0,1,0) вот я и считал что
можно из нормали организовать матрицу поворота ибо вроде косинусы с синусами туда нужны, а их есть у меня.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:50.
|