HLSL

Всичко свързано с Microsoft DirectX. Въпроси относно HLSL.
Потребителски аватар
KosSiO
Power User
Power User
Мнения: 316
Регистриран на: 20 окт 2008 19:29
Местоположение: Targovishte,Sofia

HLSL

Мнение от KosSiO » 19 авг 2011 22:08

Сега навлизам в шейдърите. Използвам d3d9. За сега използвам LPD3DXEFFECT класът, който ми е предоставен, защото изглежда по-noob friendly. Въпреки това имам доста основни въпроси, на които не можах да намеря отговори.
За сега съм написал прости vertex/pixel шейдъри(трансформиране на вертексите и лепене на текстура), но някои неща мисля, че не съм ги направил както хората.
1 - До сега подавах параметри на effect-а чрез фунцкиите ID3DXEffect::SetXXX. Слагам, също World, View, Projection матриците, чрез върпосната функция. Въпроса ми е : има ли възможност да взема матриците, които са сложени със функцията IDirect3DDevice9::SetTrasform ? Виждал съм нещо от сорта на float4x4 World : WORLD; Но при мен не работи този код...

2 - Текстурата, също я слагах чрез ID3DXEffect::SetTexture. След това замених този ред със нещо в шейдъра :
sampler tex0 : register(s0); Преди това обаче следния код :

Код: Избери всички

//cpp
Effect->SetTexture("tex0" , tex);
d3ddev->SetTexture(0,tex);//ако махна този ред е все едно, че не съм сложил текстурата до ефекта

//hlsl в шейдъра

sampler tex0;
...
Мисля, че не се изразих като хората, но мерси все пак.

3 - Последния ми въпрос за сега е : Как да взема материалите и светлините в шейдъра без да позлвам ID3DXEffect::SetXXX или не е възможно?

4 - ID3DXMesh слага ли сам VertexDeclarator?

Потребителски аватар
haho
Power User
Power User
Мнения: 999
Регистриран на: 07 дек 2003 21:52
Местоположение: България
Контакти:

Re: HLSL

Мнение от haho » 19 авг 2011 23:55

Виждам, че доста системно и упорито се развиваш. Това е много добре.
Обаче на hlsl ефектите не си им схванал основната идея, а тя е: Да не се занимаваш с d3ddevice9->SetXXX() ами повечето неща, като състояния на семплера, рендерсъстояния, пасове, шейдъри и т.н да се сетват от самия ефектен файл, а само някой параметри, като матриците например, да се сетват с d3deffect->SetXXX().

Аз от няколко години не съм използвал D3D, обече си спомням че d3deffect->SetXXX() е много по-бързо ако сетваш въпросния параметър с хендъл а не по име. Също така трябва да има и глобални параметри където като ги сетнеш и да са сетнати във всички ефекти, но както казах, не си спомням точно как ставаше. Това е посоката, в която трябва да мислиш, а не как да сетваш с d3ddevice9->SetXXX() и да го използваш в шйдъра, това е грешно.

ПП

float4x4 World : WORLD - това дето си го виждал, ако не бъркам, се нарича "Стандартна семантика и анотация". Ако шйдърите са писани от друг, например идват от Мая, Макс, енджина да види, че има анотация WORLD и да сетне на този параметър световната матрица. Виж в нета какво пише за това.

Потребителски аватар
KosSiO
Power User
Power User
Мнения: 316
Регистриран на: 20 окт 2008 19:29
Местоположение: Targovishte,Sofia

Re: HLSL

Мнение от KosSiO » 22 авг 2011 15:40

Не бързах да отговоря, защото чаках да ми се появят още въпроси.
Мерси за похвалата, дано има покритие :)

Това което направих последно е един чаник, осветен със pointlight и specular lighting. Ровейки се наляво надясно поаднах на следните термини : vertex tagnet/bionormal.. Въпросът ми е какво представляват тия параметри, за какво се използват?

SuryIIID
Power User
Power User
Мнения: 431
Регистриран на: 01 яну 2004 21:03
Местоположение: София
Контакти:

Re: HLSL

Мнение от SuryIIID » 23 авг 2011 08:33

haho написа:Виждам, че доста системно и упорито се развиваш. Това е много добре.
. Също така трябва да има и глобални параметри където като ги сетнеш и да са сетнати във всички ефекти, но както казах, не си спомням точно как ставаше.
Може би му трябва D3DXEffectPool и shared преди декларацията. Така може да светва параметри за няколко ефекта едноврменно.
Ако декларираш със семантика float4x4 matWorld : WORLD; , после можеш да вземеш хендъл към World матрицата със D3DHANDLE handle = m_pEffect->GetParameterBySemantic(NULL, "WORLD");, дори без да знаеш името на параметъра.
Доколкото знам, хендълите (D3DXHANDLE) са string poniter-и, а дали е по бързо да сетваш/гетваш параметри по име или по хендъл. Навсякъде пише, че с хендъл е по-бързо, но вътрешно ефектите не е изключено да ползват и нещо, като хеш-таблица с ключ името на параметъра. Може и да греша, но не се сещам защо пък да не може. :)

Потребителски аватар
haho
Power User
Power User
Мнения: 999
Регистриран на: 07 дек 2003 21:52
Местоположение: България
Контакти:

Re: HLSL

Мнение от haho » 23 авг 2011 10:51

KosSiO написа:Не бързах да отговоря, защото чаках да ми се появят още въпроси.
Мерси за похвалата, дано има покритие :)

Ровейки се наляво надясно поаднах на следните термини : vertex tagnet/bionormal.. Въпросът ми е какво представляват тия параметри, за какво се използват?

Това са декларации на въртекси, които после, в шйдъра, може да казваш към кои входни атрибури да се асоциират.
Например като си правиш въртекс буфера казваш нормалите са ми на еди какъв си офсет, позицията ми е на еди какъв си, тангентита са ми на... и т.н. (виж в документацията за дакларация на въртекси, ако не си видял още).

След това в шейдъра казваш

struct InputVertex
{
pos: position;
vertexNormal: normal;
};

И така рънтайма разбира как да ти подаде въртекс буфера към шейдъра

Потребителски аватар
KosSiO
Power User
Power User
Мнения: 316
Регистриран на: 20 окт 2008 19:29
Местоположение: Targovishte,Sofia

Re: HLSL

Мнение от KosSiO » 23 авг 2011 11:03

Доста подробни отговори, мерси. Иначе явно не съм си задал въпроса както трябва. Видях термините tagnet и bionormal, като свойства на вертекси (както са позицията на вертекса, нормалата, UV кодринати и тнт). Разбрах за тези параметри, че са вектори(в примера в който ги видях, даже бяха перпендикулярни един с друг и с нормалата). Така обаче и не разбрах за какво се ползват тия неща? За какво ми помагат? Какво изчислявам с тях?

Иначе със вертекс декларатора и структурата в шейдърите се справям. Може и да не ми се получава въпроса, защото не знам tagnet и bionormal какво означават и аз да чакам един тип отговор, а той да е съвсем друг.

Потребителски аватар
haho
Power User
Power User
Мнения: 999
Регистриран на: 07 дек 2003 21:52
Местоположение: България
Контакти:

Re: HLSL

Мнение от haho » 23 авг 2011 11:38

KosSiO написа: Може и да не ми се получава въпроса, защото не знам tagnet и bionormal какво означават и аз да чакам един тип отговор, а той да е съвсем друг.
Тангентата, нормалата и бинормалата оформят тъй наречения тангентен базис - кординатна система, в която се намират нормалит от нормал мап-а.

Отговори

Кой е на линия

Потребители, разглеждащи този форум: Няма регистрирани потребители и 1 гост