Tech, szoftvertervezés és programozás

Szoftverfejlesztés, Shaderprogramozás, DirectX

  • A betűméret növelése
  • Alapértelmezett betűméret
  • A betűméret csökkentése
Címlap Fórum
NyisztorKaroly.org
Helló, vendég
Kérjük, hogy jelentkezz be vagy regisztrálj.    Elfelejtetted a jelszavadat?
Shaderprogramozás (a könyv fóruma)
(1 fő olvassa) 1 vendég
Üdvözöllek a Játékfejlesztés fórumon!
A végére
TÉMA: Shaderprogramozás (a könyv fóruma)
#45
admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
graph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 2 éve, 6 hónapja  
Az első könyv az állapotokon keresztül vezérelhető, ún. Fixed Pipeline-t és az azzal megvalósítható vizuális hatásokat taglalta, az új pedig a rugalmasabb, shader alapú programozási modellt.

Ha már megvan neked a Shaderprogramozás című könyv, akkor abban leírtam, hogy mi a különbség - mondjuk olvasd el a hátsó borító szövegét.
 
Naplózott Naplózott  
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
#79
Mart1031y (Felhasználó)
Fresh Boarder
Hozzászólások: 1
graphgraph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 2 éve, 1 hónapja  
Üdv!

Nekem volna egy-két kérdésem a könyvvel kapcsolatban.
Először is van programozói tudásom valamennyire. Ismerem a Pascal, Java, C nyelvet, illetve hamarosan a C++-be is belevágok. De megvettem a könyvet előre, hogy addig is csináljak valamit. Majd az első konkrét kód után egy netes WINAPI tutorialba is belenéztem.
Az első legnagyobb problémám az lenne, hogy az első program (9.2-es fejezet) forráskódja nem lett feltöltve. Vagy legalábbis én nem láttam...
A további kérdések/gondok is ezzel a programmal kapcsolatosak.
A következő gondom az initOnce() függvénnyel van. Ez a WinMain-ből lett meghívva, de akárhogy lapozgatom a könyvet, nem találom a forráskódját, illetve a VS 2008 Express sem ismeri a parancsot.
A harmadik problémám a createWindow() függvénnyel van. Van benne egy olyan változó, hogy IDI_SAJAT_ICON. Egy kis keresgélés után jöttem rá, hogy ez szintén Winapi és egy .rc fájlban van definiálva. Ennek a fájlnak a kódját is hiányoltam, de ez még kisebb gond. (A tutorial alapján átírtam ezt a sort.)
Jelenleg ennyi kérdésem lenne. Remélem érthetően fogalmaztam és nem sok hülyeséget írtam.
Üdvözlettel: Földi Márton
Ui.: Amúgy a könyv nagyon tetszik. Az elején nagyon gyorsan átrágtam magam.
 
Naplózott Naplózott  
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
#80
admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
graph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 2 éve, 1 hónapja  
Szia Márton!

A teljes 9. fejezet (és nem csak a 9.2) az alapvető Windows programozási fogalmakat és gyakorlati teendőket taglalja, részletezve mindazt, ami a shader-alapú, DirectX alkalmazások fejlesztéséhez előfeltétel.
A 9. fejezethez nincs külön példa-project, mivel az itt részletezett forráskód fellelhető a könyv minden egyes példaprogramjában.

Az initOnce() saját függvény, amely azokat az inicializálásokat tartalmazza, amelyeket egyszer kell elvégezni, a program indításakor.
A Visual Studio lehetőséget biztosít arra, hogy odanavigálj egy adott függvény, vagy osztály deklarációjához, illetve implementációjához. Mint írtam a könyv bevezetőjében is, sok mindent részletesen elmagyarázok, azonban bizonyos előismeretek, illetve tanulás szükséges lehet a leírtak megértéséhez. A fejlesztőeszköz (Visual Studio) ismerete is előfeltétel, a témakör taglalása amúgy sem a könyv feladata.

Az *.rc állomány (ressource) egy ún. erőforrás-állomány, tehát nem egy forráskód, inkább amolyan konfigurációs állomány. Az rc fájlban például az alkalmazás ikonjának vagy a kurzor külső állományának útvonala és a fájl neve található (illetve menük esetében a menü tényleges leírása).

Remélem segítettem. Sok sikert a könyv többi részéhez!
 
Naplózott Naplózott  
 
Módosítás: 2009.12.21 14:13 Név: admin.
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
#117
kilobyte (Felhasználó)
Fresh Boarder
Hozzászólások: 1
graphgraph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 1 éve, 4 hónapja  
Hi, az a megtiszteltetés ért engem, hogy elsőként tegyek itt fel egy szakmai kérdést ^^

az environment mapping programról lenne szó. Én tökéletes tükröződést szeretnék elérni, ilyenné alakitottam át a kódot:

Kód:

uniform extern float4x4 gWorldViewProjection;
uniform extern float4x4 gWorld;
uniform extern float3   gCameraPos;
uniform extern texture  gEnvMap;


sampler SamplerEnvironmentMap = sampler_state
{
    Texture = <gEnvMap>;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
    AddressU  = Clamp;
        AddressV  = Clamp;
};
 
struct VS_OUTPUT
{
    float4 PositionProj : POSITION0;
    float3 NormalW      : TEXCOORD1;
    float3 ObjCamDirW   : TEXCOORD2;
};

VS_OUTPUT vs_main(float3 posLocal_in : POSITION0,  float3 normalLocal_in : NORMAL0, float2 tex0_in: TEXCOORD0)
{
    VS_OUTPUT outVS = (VS_OUTPUT)0;
    outVS.NormalW = normalize(mul(float4(normalLocal_in, 0.0f), gWorld).xyz);
    outVS.ObjCamDirW = normalize( gCameraPos - mul(float4(posLocal_in, 1.0f), gWorld).xyz );
    outVS.PositionProj = mul(float4(posLocal_in, 1.0f), gWorldViewProjection);
    return outVS;
}

float4 ps_main(float3 normalW_in : TEXCOORD1, float3 objCamDirW_in : TEXCOORD2) : COLOR
{
 float3 envMapSamplerRay = reflect (normalize(-objCamDirW_in), normalize(normalW_in));
 return texCUBE (SamplerEnvironmentMap, envMapSamplerRay);
}

technique EnvironmentMapTech
{
    pass P0
    {
        vertexShader = compile vs_2_0 vs_main();
        pixelShader  = compile ps_2_0 ps_main();
    }
}



de sajnos a kép elég torz. Remélem igy érthetően fogalmaztam meg, ha nem, majd küldök be képet is.
 
Naplózott Naplózott  
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
#143
Quantum (Felhasználó)
Junior Boarder
Hozzászólások: 21
graphgraph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 3 hete, 2 napja  
Helló Carlos!
A napokban elkezdtem tanulni a shaderprogolást és máris elakadtam. Nézegettem, tekergettem, többször átírtam, átgondoltam, de a 11.6.2-es fejezetben lévő Terjedő, diffúz fényvisszaverődés egyszerűen hibásan működik nálam. A dologhoz hozzátartozik, hogy DirectX 10 alól hívom a kódot, amit Shader Model 4.0 szabvány szerint készítettem el (tudom, DX9-ben, SM 2.1-ben jobb lenne nekem, mint kezdőnek, de sajnos makacs vagyok, meg annyira nem lehet nagy eltérés, hogy igazi gondot okozzon). Ugye mivel itt már nincsen fixed pipeline, a nézeti- és a projekciós mátrixszorzás a vertex shader-ben megy (ha jól értettem a dolgokat).
Na, a hiba pedig az, hogy van ugye egy pontszerű fényforrásom, aminek ismerem a helyzetét, ismerem a modell vertexjei helyzeteit, éleit és lapjait, de a vertexek megfelelő színeit elég rosszul számítja ki. Kicsit olyan, mintha rossz lenne azok sorrendje, így pl. amikor egy vertex közelébe viszem a fénypontot, akkor nem feltétlen az lesz teljesen világos, hanem egy másik. Nem sikerült logikát találni a kapott végeredményben.
Az alábbi linken bemutatom a problémát. Az A, B, C, D és E a lapokat segíti megkülönböztetni egymástól, ahol az E a felső lap. Az L a fényforrás. Elvileg az A oldalnak sötétbe kellene buknia, mivel arra közvetlenül nem eshet fény.
http://kepfeltoltes.hu/view/120116/VSpro...kepfeltoltes.hu_.png

Ez pedig a HLSL kódom:
Kód:


// Globális változók
matrix gWorldMatrix;
matrix gViewMatrix;
matrix gProjectionMatrix;
float4 gAmbientMatColor;
float4 gDiffuseMatColor;
float4 gLightColor;
float3 gLightPos;

// Típusok
struct VertexInput
{
float3 position : POSITION;
float3 normal : NORMAL;
};

struct PixelInput
{
float4 PositionProj : SV_POSITION;
float4 VertexColor : COLOR;
};

PixelInput vs_main( VertexInput input )
{
// eredmény struktúra kinullázása
PixelInput output = (PixelInput)0;

// felületi normálvektor modellétrőbl világ-koordinátarendszerbe transzformálása
float3 normalW = mul( float4( input.normal, 0.0f ), gWorldMatrix ).xyz;
normalW = normalize( normalW );

// csúcspont helyzetének transzformálása világkoordinátarendszerbe
float3 posW = mul( float4( input.position, 1.0f ), gWorldMatrix ).xyz;

// fényvektor kiszámítása
float3 lightVectorW = normalize( gLightPos - posW );

// fényintenzitás kiszámítása a Lambert-féle koszinusz függvénnyel
float i_diffuse = max( dot( lightVectorW, normalW ), 0.0f );
// diffúz szín kiszámítása
float3 diffuseColor = i_diffuse * ( gDiffuseMatColor * gLightColor ).rgb;

// kimeneti struktúra feltöltése
output.VertexColor = float4( ( gAmbientMatColor.rgb + diffuseColor ), gDiffuseMatColor.a );

output.PositionProj = mul( float4( posW, 1.0f ), gViewMatrix );
output.PositionProj = mul( output.PositionProj, gProjectionMatrix );

return output;
}

float4 ps_main( PixelInput input ) : SV_Target
{
return input.VertexColor;
}

technique10 ambientcolor
{
pass pass0
{
SetVertexShader( CompileShader( vs_4_0, vs_main() ) );
SetPixelShader( CompileShader( ps_4_0, ps_main() ) );
SetGeometryShader( NULL );
}
}


Mit rontottam el?
Elnézést a hosszú post-ért.
Segítséged előre is köszönöm.
 
Naplózott Naplózott  
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
#144
admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
graph
A felhasználó távol van Kattints ide a felhasználó profiljának megtekintéséhez
Vá: Shaderprogramozás (a könyv fóruma) 3 hete, 2 napja  
Szia Quantum!

Nekem úgy tűnik a screenshot-ok alapján, hogy rosszul van megadva a csúcspontok bejárási sorrendje. Mivel ez befolyásolja a normálvektorok kiszámítását, a megvilágított modell természetellenesen lesz megvilágítva.
 
Naplózott Naplózott  
 
Módosítás: 2012.01.16 17:19 Név: admin.
  Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
Az elejére