forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Нубошоу по шейдерам. (http://forum.boolean.name/showthread.php?t=15694)

dsd 19.11.2011 01:41

Ответ: Нубошоу по шейдерам.
 
Вот так я в хорсе пытаюсь передать в шейдер матрицу от камеры с которой отрисована текстура с расстоянием от света до поверхности.

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 другой камеры?

Mr_F_ 19.11.2011 02:36

Ответ: Нубошоу по шейдерам.
 
Цитата:

xSetEffectMatrix(entity,"v_proj",xGetViewProjMatri x(shadecam),0);
каждый кадр вызываешь, надеюсь?

dsd 19.11.2011 03:07

Ответ: Нубошоу по шейдерам.
 
Да.
На глаз получается, что текстурные координаты не зависят от позиции пикселя, я так понимаю это от того, что вместо матрицы из хорса пришло ничто, нули и поэтому выбирается только одна точка. Т.е. косяк скорей всего в моем коде внутри хорса, но как правильно это сделать я не знаю.

Mr_F_ 19.11.2011 03:42

Ответ: Нубошоу по шейдерам.
 
хз, я юзал xGetViewProjMatrix чтобы проецировать декали из камер, так что в ксорсе в этом плане всё должно быть ок.
--
а, хотя нет.
я юзал
castermatrix=xGetProjectionMatrix(castercamera)
castermatrix2=xGetViewMatrix(castercamera)

dsd 25.08.2012 16:25

Ответ: Нубошоу по шейдерам.
 
Захотелось мне свой бамп сочинить.

Вот есть у меня нормаль. И есть нормаль из нормалмапы
vec3 norm = normalize(texture2D(texture1,fragmentuv).xyz*2-1.0);
Как мне сбацать из нормали матрицу поворота на которую умножить надо нормаль из нормалмапы?

Mr_F_ 25.08.2012 17:20

Ответ: Нубошоу по шейдерам.
 
Цитата:

Как мне сбацать из нормали матрицу поворота
нормально никак, для этого препросчитывают ещё две оси (tangent, binormal) в зависимости от UV и всякой шняги. если у тебя какая-нибудь плоскость воды, то можно легко сочинить эти оси, а на произвольном меше только препросчёт.
ну есть бомжарский способ через ddx/ddy, но качество будет страдать.

HolyDel 25.08.2012 17:20

Ответ: Нубошоу по шейдерам.
 
зачем?
если у тебя нормалкарта в объектспейсе, то просто бери значение нормали из нее.

если у тебя нормалкарта в тангентспейсе, то тебе нужно перевести источник света в тангент спейс как то так:
Код:

"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, но качество будет страдать.
а можно поподробнее?

Mr_F_ 25.08.2012 17:23

Ответ: Нубошоу по шейдерам.
 
Цитата:

если у тебя нормалкарта в тангентспейсе, то тебе нужно перевести источник света в тангент спейс как то так:
необяз, можно и тангент-нормалмапу переводить в обжектспейс, а потом применять 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/

dsd 25.08.2012 18:47

Ответ: Нубошоу по шейдерам.
 
Хочу на свой меш ландшафта бамп и потом тесселяцию со смещением по картам сделать. Так что кроме нормали и текстурных координат у меня нет ничего и вообще слов то таких про тангентспейс я не знаю :))

Но ведь нормаль можно смотреть как
(cos кИкс * sin кЗед; соs кИгрек * sin кЗед; cos кЗед)
А карта у меня сделана для отклонения нормали (0,1,0) вот я и считал что
можно из нормали организовать матрицу поворота :dontknow: ибо вроде косинусы с синусами туда нужны, а их есть у меня.


Часовой пояс GMT +4, время: 03:32.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot