admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
|
|
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
|
|
|
Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
|
Mart1031y (Felhasználó)
Fresh Boarder
Hozzászólások: 1
|
|
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
|
|
|
Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
|
admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
|
|
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
|
|
|
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.
|
kilobyte (Felhasználó)
Fresh Boarder
Hozzászólások: 1
|
|
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
|
|
|
Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
|
Quantum (Felhasználó)
Junior Boarder
Hozzászólások: 21
|
|
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
|
|
|
Az adminisztrátor megtiltotta a mindenki által történő hozzászólást.
|
admin (Adminisztrátor)
Adminisztrátor
Hozzászólások: 57
|
|
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
|
|
|
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.
|
|