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 21.10.2011 21:23

Нубошоу по шейдерам.
 
Код:

struct VSOutput
{
float4 position : POSITION;
float4 position2 : TEXCOORD2;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};

Вставляю в вывод вершинного шейдера выделенную строку и шейдер перестает исполнятся, хотя из:
Цитата:

В качестве результата своей работы, вершинные шейдер помет возвращать сле-дующие данные:

POSITION0 – трансформированная позиция вершины.

COLOR[n] – значение цвета, стоит отметить, что записывать именно цвет сюда вовсе необязательно, например, в случае если необходимо передать в пиксельный шейдер позицию, ее спокойно можно поместить в любое поле с семантикой COLOR или TEXCOORD.

TEXCOORD[n] – текстурные координаты. Не обязательно float2 зна-чение, может быть любым в зависимости от ваших нужд (например, для передачи нормали можно использовать float3).

FOG – float значения тумана для данной вершины.

PSIZE – размер точки. Действует только на точечные спрайты (системы частиц).
Например, если нам необходимо рассчитать попиксельное
Код:

struct VSOutput
{
float4 position : POSITION;
float4 position2 : TEXCOORD1;
float3 normal : TEXCOORD2;
float2 texCoords0 : TEXCOORD0;
};

Т.к. в качестве входных данных пиксельный шейдер может принимать только цвет и текстурные координаты (т.е. поля можно объявлять только с семантиками COLOR и TEXCOORD), для передачи в пиксельный шейдер позиции вершины и ее нормали необходимо записать их в поля с семантиками текстурных координат.
Однако, вполне допустимо использовать выходную структуру вершинного шей-дера в качестве входной пиксельного, но только до тех пор пока в пиксельном шей-дере не происходит обращения к полям с недопустимой семантикой (например POSITION), что вызовет ошибку компиляции шейдера.
следует, что такая структура допустима.
Где я не прав? Мне почему-то кажется, что стандартный шейдер из шагов с таким изменением вывода вершинного шейдера должен работать. Или шаги уже устарели?

Mr_F_ 21.10.2011 21:41

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

шейдер перестает исполнятся
компилятор должен написать причину ошибки.
в том числе вроде как компиляция фейлится если ты не до конца заполнил выходящую структуру.
т.е. просто добавил в структуру поле, но не закидал в него данные в VS.

moka 21.10.2011 22:01

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

.Squid 21.10.2011 22:01

Ответ: Нубошоу по шейдерам.
 
Извольте включить логгирование, сударь: xCreateLog(). В созданном html-файле Вы обнаружите крайне полезную для Вас информацию.

dsd 21.10.2011 22:10

Ответ: Нубошоу по шейдерам.
 
Да. Круто. Спасибо.

dsd 22.10.2011 23:43

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

Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?

Код:

float4 ambient : COLOR_AMBIENT;
...
float4 color=saturate(diffuse * lit * lightColor+diffuse*ambient);
...

Ambientcolor надо так учитывать или по другому?

Mr_F_ 23.10.2011 00:05

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

Подобные косяки с освещением лечатся попиксельным освещением(как-нибудь еще но тоже шейдером) или нужно ковырять модель?
проверь попиксельное - делов то. если не пофиксится, то хз.
Цитата:

Ambientcolor надо так учитывать или по другому?
так у тебя пересветится всё может.
мне больше нравится такой вариант:
lit = saturate(dot(normal,lightDir));
float4 color = diffuse * lerp(ambientColor,lightColor,lit) * 2;

"*2" позволяет делать цвета диффуза ярче оригинала. собстсвенно, формула diff*lit*2, это бленд Multiply2, который есть в блице например, и юзается во всех играх для лайтмапов.

dsd 23.10.2011 00:13

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

Цитата:

lit = saturate(dot(normal,lightDir);
На мой взгляд тут saturate как козе баян, косинус не будет больше 1, а эта команда если я не ошибаюсь возвращает косинус угла между векторами, но может я и гоню. Наврал. Там еще на длины векторов умножается.

Mr_F_ 23.10.2011 00:21

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

На мой взгляд тут saturate как козе баян
в lerp будет разница

.Squid 23.10.2011 01:42

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

Сообщение от dsd (Сообщение 206647)
На мой взгляд тут saturate как козе баян, косинус не будет больше 1

Сударь, Вы не учли тот случай, при котором косинус меньше ноля.

Randomize 23.10.2011 14:51

Ответ: Нубошоу по шейдерам.
 
Оу, какая познавательная тема!

dsd 25.10.2011 20:20

Ответ: Нубошоу по шейдерам.
 
У меня глупый вопрос: как я могу создать текстуру шейдером? В том смысле, что создать шейдер, который будет рисовать в текстуру. Пытался гуглить, но не смог.

Mr_F_ 25.10.2011 21:37

Ответ: Нубошоу по шейдерам.
 
в ксорсе вроде как создаёшь текстуру, делаешь xSetBuffer(xTextureBuffer(texture)), и будет рисоваться в неё.

HolyDel 25.10.2011 21:50

Ответ: Нубошоу по шейдерам.
 
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.

Crayzi 26.10.2011 13:26

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

Сообщение от HolyDel (Сообщение 206960)
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером.

Ото матерится по учёному)

Reizel 26.10.2011 13:50

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

Сообщение от Crayzi (Сообщение 207057)

Ото матерится по учёному)

Full Tex Size Quad - это мат оО??

impersonalis 26.10.2011 16:29

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

фуллтекссайзквад
хорошее название для группы

dsd 02.11.2011 01:42

Ответ: Нубошоу по шейдерам.
 
xCreateTextureFromData ( void * pixelsData,
int width,
int height,
int flags = 9,
int frames = 1
)
" void * pixelsData," вот это что и как его создать?


Handle tex3d=xCreateTexture(64,64,1024,64); Таким образом получится 3д текстура. И фреймы будут подразумевать третье измерение, а доступ к слоям xTextureBuffer(tex3d, layervar); Так?

Mr_F_ 02.11.2011 01:44

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

вот это что и как его создать?
создаёт текстуру из указателя на пиксели (типа как при открытии RAW в фотошопе)

dsd 02.11.2011 01:49

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

Сообщение от Mr_F_ (Сообщение 207911)
создаёт текстуру из указателя на пиксели (типа как при открытии RAW в фотошопе)

Элегантный посыл нахер. Это значит что своими ручками я в памяти не смогу организовать подобное из цыфирек? Мне интересен сам процесс генерации подобных данных.

Mr_F_ 02.11.2011 01:55

Ответ: Нубошоу по шейдерам.
 
насколько я помню, просто линейно расположенные RGBA (по байту на канал) готовишь

dsd 12.11.2011 19:59

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

Сделал я в пайнте вот такую текстуру только больше, И возникла у меня следующая проблема у текстур граничащих с краем наблюдается вот такой эффект:


Пропадающий при вот этих настройках:
Код:

texture main;
sampler mainSampler = sampler_state{
Texture = <main>;
AddressU = CLAMP;
AddressV = CLAMP;
AddressW = CLAMP;
MinFilter = NONE;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy=5;

Но появляется "шевеление" текстуры, это как-то лечится магическим флагом или надо просто не использовать какую-то часть по контуру?

Mr_F_ 12.11.2011 20:37

Ответ: Нубошоу по шейдерам.
 
типичная проблема атласов.
как это можно решать:
1) хранишь не кратные степени двойки тайлы, вокруг каждого ободок в 4 пикселя в виде "продолжения" этого тайла. в шейдере уменьшаешь текскоорды, чтобы взять только нужный квадрат, остальные 4 юзаются для фильтрации.
2) вместо обычной tex2d юзаешь
float2 TexCoords = текстурные координаты, какие были бы если б ты ими 1 тайл тайлили.
float2 dx = ddx(TexCoords);
float2 dy = ddy(TexCoords);
float4 tex = tex2Dgrad(mytex,TexCoords,dx,dy);

зачем это нужно - когда видюха семплит текстуру, она выбирает правильный мип, если у тебя там резкий перепад текстурных координат (например у одного пикселя 0, у следующего 1), то выбирается лоуресный мип (потому что типа если маленькое расстояние между пикселями на триангле, значит текстура сплющена там, значит ей не нужен хайрес там - думает видюха), и выходит что если ты тайлишь атлас каким-нибудь fmodoм, на стыках тайлов швы.
tex2Dgrad позволяет делать выборку с заранее посчитанными данными, по которым выберется мип.
но он помедленнее будет обычного tex2D.
на самом деле ваще не рекомендую нифига юзать такие атласы на терейн, хотя как знаешь.

dsd 14.11.2011 01:40

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

Цитата:

tex2Dgrad(s, t, ddx, ddy) - делает градиентную выборку точки из 2D текстуры s по координатам t Недоступно в шейдерной модели 1.х
На глаз получается, что их надо указывать в долях от 1, и это будет как шаг из текстуры? То есть чем ближе к камере тем ближе число к 0, а чем дальше тем ближе к 1? Кстати у меня оно работает быстрей обычного tex2D() в четверо почему то.

HolyDel 14.11.2011 02:22

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

на самом деле ваще не рекомендую нифига юзать такие атласы на терейн, хотя как знаешь.
что порекомендуешь вместо атласов, Ф?

.Squid 14.11.2011 02:25

Ответ: Нубошоу по шейдерам.
 
Последние два значения задают скорость изменения текстурных координат, которая нужна для определения оптимального мип-уровня и которая вычисляется сама для tex2D из заданных текстурных координат.
Собственно, Мр_Ф это и написал.
Помнится мне, что ты используешь динамический бранчинг. Так вот, если в нем есть tex2D, то бранчинг не работает и вычисляет все варианты, что вполне может снижать производительсноть. А не работает он потому, что:
1) ГПУ работает с блоками 2х2 пикселя;
2) для tex2D вот эти вот частные производные, которые передаются последними параметрами в tex2Dgrad, вычисляются автоматически из этого блока 2х2 пикселя;
3) пиксели из одного блока 2х2 могут быть обработаны разными ветками, и в этом случае вычисленные производные окажутся невалидными;
4) поэтому компилер шойдеров исключает такой случай и выбрасывает tex2D за пределы бранчинга.
Соотвественно, если, у тебя было 4 ветки и в каждой свой tex2D, то на самом деле они всегда все вызывались.
tex2Dgrad не требует автоматически вычисленных производных, поэтому может работать в бранчинге. Только производные надо вычислять за пределами бранчинга.

Цитата:

Сообщение от HolyDel (Сообщение 209600)
что порекомендуешь вместо атласов, Ф?

У тебя же ОГЛ какой там по счету? Там нет аналога текстурных массивов из ДХ11? Мне кажется, что они удобнее всего в данной ситуации.

HolyDel 14.11.2011 02:36

Ответ: Нубошоу по шейдерам.
 
мне интересно что порекомендует Ф для DX9 железа. Насколько я знаю они пишут движок/ игрушку под девятый. Возможно есть какая-нибудь интересная идея. И еще у текстурных массивов должны быть размеры одинаковые для каждого элемента. это логично, но не всегда удобно.

Mr_F_ 14.11.2011 05:33

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

мне интересно что порекомендует Ф для DX9 железа. Насколько я знаю они пишут движок/ игрушку под девятый. Возможно есть какая-нибудь интересная идея.
ну у нас некое подобие мегатекстуры, а т.к. используется только на террейне, то просто подогнано чтобы на 1 дип терейна была 1 текстура. швы хотя все равно исправлять приходится, но только связанные с прерыванием фильтрации.

а так вообще тут Сквид в асе недавно вбросил про 3д текстуры.
не уверен насчёт производительности, но в плане минимального геморроя и хорошего качества это лучший вариант.

dsd 18.11.2011 20:38

Ответ: Нубошоу по шейдерам.
 
Как имея позицию камеры, ее поворот и соотношение сторон камеры собрать для нее в шейдере мировую и проекционную матрицы? Мне нужно иметь в шейдере как бы две камеры.
Или хотя бы дайте ссылку, где все кратко написано, но есть расшифровка где, чо. А то я только про операции над матрицами найти могу инфу. Но, блин, мне транспонирование и умножение матриц не помогают XD. Причем раньше попадалось, то что нужно, а щас никак. Такое ощущение, что гугол издевается надо мной.

Справился :) xGetViewProjMatrix ( Camera * camera )

dsd 18.11.2011 23:59

Ответ: Нубошоу по шейдерам.
 
В вершинном переводим вершины в координаты на экране.
output.position = mul(input.position, matrixWorldViewProj);

Допустим VPOS мне не подходит.

Так я получу координаты на поверхности экрана:
u=output.position.x/output.position.w
v=output.position.y/output.position.w ?
В каких пределах они будут изменяться если соотношение сторон 1:1?
от -1,-1 к 1,1 или от 0,0 к 1,1. Или это вообще не так делается?

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:39.

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