![]() |
Нубошоу по шейдерам.
Код:
struct VSOutput Цитата:
Где я не прав? Мне почему-то кажется, что стандартный шейдер из шагов с таким изменением вывода вершинного шейдера должен работать. Или шаги уже устарели? |
Ответ: Нубошоу по шейдерам.
Цитата:
в том числе вроде как компиляция фейлится если ты не до конца заполнил выходящую структуру. т.е. просто добавил в структуру поле, но не закидал в него данные в VS. |
Ответ: Нубошоу по шейдерам.
float2?
|
Ответ: Нубошоу по шейдерам.
Извольте включить логгирование, сударь: xCreateLog(). В созданном html-файле Вы обнаружите крайне полезную для Вас информацию.
|
Ответ: Нубошоу по шейдерам.
Да. Круто. Спасибо.
|
Ответ: Нубошоу по шейдерам.
|
Ответ: Нубошоу по шейдерам.
Цитата:
Цитата:
мне больше нравится такой вариант: lit = saturate(dot(normal,lightDir)); float4 color = diffuse * lerp(ambientColor,lightColor,lit) * 2; "*2" позволяет делать цвета диффуза ярче оригинала. собстсвенно, формула diff*lit*2, это бленд Multiply2, который есть в блице например, и юзается во всех играх для лайтмапов. |
Ответ: Нубошоу по шейдерам.
На уровне модели это вылечить можно запретив нормалям вершин на углах клеток одновременно наклоняться к диагонали. Но это сортировать и сравнивать надо командой наподобие dot
Цитата:
|
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
|
Ответ: Нубошоу по шейдерам.
У меня глупый вопрос: как я могу создать текстуру шейдером? В том смысле, что создать шейдер, который будет рисовать в текстуру. Пытался гуглить, но не смог.
|
Ответ: Нубошоу по шейдерам.
в ксорсе вроде как создаёшь текстуру, делаешь xSetBuffer(xTextureBuffer(texture)), и будет рисоваться в неё.
|
Ответ: Нубошоу по шейдерам.
писать напрямую в текстуру из шейдера можно только на SM 5.0.
однако никто не мешает задать текстуру как рендертаргет и рисовать в нее фуллтекссайзквад. с нужным шейдером. |
Ответ: Нубошоу по шейдерам.
|
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
|
Ответ: Нубошоу по шейдерам.
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); Так? |
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
насколько я помню, просто линейно расположенные RGBA (по байту на канал) готовишь
|
Ответ: Нубошоу по шейдерам.
типичная проблема атласов.
как это можно решать: 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. на самом деле ваще не рекомендую нифига юзать такие атласы на терейн, хотя как знаешь. |
Ответ: Нубошоу по шейдерам.
Чет я никак не вкурю что последние два значения делают.
Цитата:
|
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
Последние два значения задают скорость изменения текстурных координат, которая нужна для определения оптимального мип-уровня и которая вычисляется сама для tex2D из заданных текстурных координат.
Собственно, Мр_Ф это и написал. Помнится мне, что ты используешь динамический бранчинг. Так вот, если в нем есть tex2D, то бранчинг не работает и вычисляет все варианты, что вполне может снижать производительсноть. А не работает он потому, что: 1) ГПУ работает с блоками 2х2 пикселя; 2) для tex2D вот эти вот частные производные, которые передаются последними параметрами в tex2Dgrad, вычисляются автоматически из этого блока 2х2 пикселя; 3) пиксели из одного блока 2х2 могут быть обработаны разными ветками, и в этом случае вычисленные производные окажутся невалидными; 4) поэтому компилер шойдеров исключает такой случай и выбрасывает tex2D за пределы бранчинга. Соотвественно, если, у тебя было 4 ветки и в каждой свой tex2D, то на самом деле они всегда все вызывались. tex2Dgrad не требует автоматически вычисленных производных, поэтому может работать в бранчинге. Только производные надо вычислять за пределами бранчинга. Цитата:
|
Ответ: Нубошоу по шейдерам.
мне интересно что порекомендует Ф для DX9 железа. Насколько я знаю они пишут движок/ игрушку под девятый. Возможно есть какая-нибудь интересная идея. И еще у текстурных массивов должны быть размеры одинаковые для каждого элемента. это логично, но не всегда удобно.
|
Ответ: Нубошоу по шейдерам.
Цитата:
а так вообще тут Сквид в асе недавно вбросил про 3д текстуры. не уверен насчёт производительности, но в плане минимального геморроя и хорошего качества это лучший вариант. |
Ответ: Нубошоу по шейдерам.
Как имея позицию камеры, ее поворот и соотношение сторон камеры собрать для нее в шейдере мировую и проекционную матрицы? Мне нужно иметь в шейдере как бы две камеры.
Или хотя бы дайте ссылку, где все кратко написано, но есть расшифровка где, чо. А то я только про операции над матрицами найти могу инфу. Но, блин, мне транспонирование и умножение матриц не помогают XD. Причем раньше попадалось, то что нужно, а щас никак. Такое ощущение, что гугол издевается надо мной. Справился :) xGetViewProjMatrix ( Camera * camera ) |
Ответ: Нубошоу по шейдерам.
В вершинном переводим вершины в координаты на экране.
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. Или это вообще не так делается? |
Ответ: Нубошоу по шейдерам.
Вот так я в хорсе пытаюсь передать в шейдер матрицу от камеры с которой отрисована текстура с расстоянием от света до поверхности.
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 другой камеры? |
Ответ: Нубошоу по шейдерам.
Цитата:
|
Ответ: Нубошоу по шейдерам.
Да.
На глаз получается, что текстурные координаты не зависят от позиции пикселя, я так понимаю это от того, что вместо матрицы из хорса пришло ничто, нули и поэтому выбирается только одна точка. Т.е. косяк скорей всего в моем коде внутри хорса, но как правильно это сделать я не знаю. |
Ответ: Нубошоу по шейдерам.
хз, я юзал xGetViewProjMatrix чтобы проецировать декали из камер, так что в ксорсе в этом плане всё должно быть ок.
-- а, хотя нет. я юзал castermatrix=xGetProjectionMatrix(castercamera) castermatrix2=xGetViewMatrix(castercamera) |
Ответ: Нубошоу по шейдерам.
Захотелось мне свой бамп сочинить.
Вот есть у меня нормаль. И есть нормаль из нормалмапы vec3 norm = normalize(texture2D(texture1,fragmentuv).xyz*2-1.0); Как мне сбацать из нормали матрицу поворота на которую умножить надо нормаль из нормалмапы? |
Ответ: Нубошоу по шейдерам.
Цитата:
ну есть бомжарский способ через ddx/ddy, но качество будет страдать. |
Ответ: Нубошоу по шейдерам.
зачем?
если у тебя нормалкарта в объектспейсе, то просто бери значение нормали из нее. если у тебя нормалкарта в тангентспейсе, то тебе нужно перевести источник света в тангент спейс как то так: Код:
"vec3 n = normalize(normalmatrix * normal);\n" Цитата:
|
Ответ: Нубошоу по шейдерам.
Цитата:
-- Цитата:
для нормали результат может выглядеть так: 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/ |
Ответ: Нубошоу по шейдерам.
Хочу на свой меш ландшафта бамп и потом тесселяцию со смещением по картам сделать. Так что кроме нормали и текстурных координат у меня нет ничего и вообще слов то таких про тангентспейс я не знаю :))
Но ведь нормаль можно смотреть как (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