Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
// Konstanten float4x4 g_mComboMatrix; float4x4 g_mWorldMatrix; TEXTURE g_Texture; float3 g_DirLightDir; float3 g_DirLightAmbient; float3 g_CamPos; float4 g_Diffuse; float3 g_Emissive; float3 g_Specular; float1 g_Power; // Sampler sampler Texture_Sampler = sampler_state { texture = <g_Texture>; }; // Vertexshader Input struct VS_INPUT { float4 Pos : POSITION; float3 Norm : NORMAL; float2 Tex0 : TEXCOORD0; }; // Vertexshader Output struct VS_OUTPUT { float4 Pos : POSITION; float2 Tex0 : TEXCOORD0; float1 LightIntens : TEXCOORD1; float3 Normal : TEXCOORD2; float3 ViewDir : TEXCOORD3; }; // Vertexshader VS_OUTPUT vs_StdDirLightingSpec(VS_INPUT In) { VS_OUTPUT Out; // Normalenvektor transformieren In.Norm = mul(In.Norm, g_mWorldMatrix); // Texturkoordinaten übernehmen Out.Tex0 = In.Tex0; // Position Out.Pos = mul(In.Pos, g_mComboMatrix); // Lichtinensität Out.LightIntens = dot(In.Norm, -g_DirLightDir); // Vektor zur Kamera float3 PosWorld = normalize(mul(In.Pos, g_mWorldMatrix)); Out.ViewDir = normalize(g_CamPos - PosWorld); // Normalenvektor weitergeben Out.Normal = In.Norm; return Out; } // Pixelshader float4 ps_StdDirLightingSpec(VS_OUTPUT In) : COLOR { // Textur sampeln float4 Texture = tex2D(Texture_Sampler, In.Tex0); // Diffuse, Ambient und Textur float3 Color = Texture.rgb * (mul(g_Diffuse.rgb, In.LightIntens) + g_DirLightAmbient); // Emissive hinzufügen Color += g_Emissive; // Specular hinzufügen float3 Reflect = normalize(2 * In.LightIntens * In.Normal - g_DirLightDir); Color += pow(dot(Reflect, In.ViewDir), g_Power) * g_Specular; // Zurückgeben return float4(Color.rgb, g_Diffuse.a); } //////////////////////////////////// TECHNIQUE T0 { PASS P0 { VertexShader = compile vs_1_1 vs_StdDirLightingSpec(); PixelShader = compile ps_2_0 ps_StdDirLightingSpec(); } } |
Quellcode |
|
1 |
float3 PosWorld = normalize(mul(In.Pos, g_mWorldMatrix)); |
Quellcode |
|
1 |
Out.LightIntens = dot(In.Norm, -g_DirLightDir); |
Zitat
Der momentane Specularshader sieht im Programm genauso aus wie der ohne Specular.
Quellcode |
|
1 |
float3 Reflect = normalize(2 * In.LightIntens * In.Normal - g_DirLightDir); |
Zitat
g_DirLightDir is die richtung AUS der das licht kommt im worldspace.
Sry ich versteh nicht ganz was du meinst.Zitat
interpolierten normalvektor im pixel shader nochmals normalisieren
Zitat
besser wärs aber evtl., nicht alle vertices in weltkoordianten umzurechnen, sondern das licht und die kamera in lokale koordinaten zu transformieren, da du ja sowieso einen draw aufruf pro objekt benötigst.
Zitat
möglich dass ich mich irre, aber wenn g_DirLightDir die richtung AUS der das licht kommt is, dann sollte da net - sonder + stehn!?
Zitat
Ich dreh doch den Normalenvektor mit In.Norm = mul(In.Norm, g_mWorldMatrix); am Anfang des Vertexshaders (?).
Zitat
Sry ich versteh nicht ganz was du meinst.Zitat
interpolierten normalvektor im pixel shader nochmals normalisieren
Zitat
Zitat
besser wärs aber evtl., nicht alle vertices in weltkoordianten umzurechnen, sondern das licht und die kamera in lokale koordinaten zu transformieren, da du ja sowieso einen draw aufruf pro objekt benötigst.
Hmmm... Also müsste ich im voraus das Licht und Kamera mit der inversen Weltmatrix transformieren (bidde nich haun wenn ich schmarrn red)?
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
// Globale Konstanten float4x4 g_mComboMatrix; float3x3 g_mWorldMatrix; TEXTURE g_Texture; float3 g_DirLightDir; float3 g_DirLightAmbient; float4 g_Diffuse; float3 g_Emissive; // Sampler sampler Texture_Sampler = sampler_state { texture = <g_Texture>; }; // Vertexdefinitionen // Vertexshader Input struct VS_INPUT { float4 Pos : POSITION; float3 Norm : NORMAL; float2 Tex0 : TEXCOORD0; }; // Vertexshader Output struct VS_OUTPUT { float4 Pos : POSITION; float2 Tex0 : TEXCOORD0; float3 Norm : TEXCOORD1; }; // Vertexshader VS_OUTPUT vs_StdDirLighting(VS_INPUT In) { VS_OUTPUT Out; // Normalenvektor Out.Norm = mul(In.Norm, g_mWorldMatrix); // Texturkoordinaten übernehmen Out.Tex0 = In.Tex0; // Position Out.Pos = mul(In.Pos, g_mComboMatrix); return Out; } // Pixelshader float4 ps_StdDirLighting(VS_OUTPUT In) : COLOR { // Normalisieren, da durch Shading böse geworden In.Norm = normalize(In.Norm); // Lichtintensität float1 LightIntens = dot(In.Norm, -g_DirLightDir); // Textur samplen float4 Texture = tex2D(Texture_Sampler, In.Tex0); // Diffuse, Ambient und Textur float3 Color = Texture.rgb * (mul(g_Diffuse.rgb, LightIntens) + g_DirLightAmbient); // Emissive hinzufügen Color += g_Emissive; return float4(Color.rgb, g_Diffuse.a+Texture.a-1.0f); } //////////////////////////////////// TECHNIQUE T0 { PASS P0 { VertexShader = compile vs_1_1 vs_StdDirLighting(); PixelShader = compile ps_2_0 ps_StdDirLighting(); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
gve::Matrix mTranspInversWorld = gve::MatrixInvert(pCurEntry->Data->mTransScaleRotMatrix); mTranspInversWorld = gve::MatrixTranspose(mTranspInversWorld); gve::Vector3 vRelDirLightDir; // = gve::Vector3TransformNormal(vRelDirLightDir, mTranspInversWorld); vRelDirLightDir.x = vDirLightDir.x * mTranspInversWorld.m11 + vDirLightDir.y * mTranspInversWorld.m21 + vDirLightDir.z * mTranspInversWorld.m31; vRelDirLightDir.y = vDirLightDir.x * mTranspInversWorld.m12 + vDirLightDir.y * mTranspInversWorld.m22 + vDirLightDir.z * mTranspInversWorld.m32; vRelDirLightDir.z = vDirLightDir.x * mTranspInversWorld.m13 + vDirLightDir.y * mTranspInversWorld.m23 + vDirLightDir.z * mTranspInversWorld.m33; vRelDirLightDir = gve::Vector3Normalize(vRelDirLightDir); m_pStdDirLightingShader->GetEffect()->SetVector("g_RelDirLightDir", &D3DXVECTOR4(vRelDirLightDir.x, vRelDirLightDir.y, vRelDirLightDir.z, 1.0f)); |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
// Globale Konstanten float4x4 g_mComboMatrix; TEXTURE g_Texture; float3 g_RelDirLightDir; float3 g_DirLightAmbient; float4 g_cDiffuse; float3 g_cEmissive; // Sampler sampler Texture_Sampler = sampler_state { texture = <g_Texture>; }; // Vertexshader Input struct VS_INPUT { float4 Pos : POSITION; float3 Norm : NORMAL; float2 Tex0 : TEXCOORD0; }; // Vertexshader Output struct VS_OUTPUT { float4 Pos : POSITION; float2 Tex0 : TEXCOORD0; float3 Norm : TEXCOORD1; }; // Vertexshader VS_OUTPUT vs_StdDirLighting(VS_INPUT In) { VS_OUTPUT Out; Out.Norm = In.Norm; Out.Tex0 = In.Tex0; Out.Pos = mul(In.Pos, g_mComboMatrix); return Out; } // Pixelshader float4 ps_StdDirLighting(VS_OUTPUT In) : COLOR { In.Norm = normalize(In.Norm); float1 LightIntens = saturate(dot(In.Norm, -g_RelDirLightDir)); float4 Texture = tex2D(Texture_Sampler, In.Tex0); float3 Color = Texture.rgb * (mul(g_cDiffuse.rgb, LightIntens) + g_DirLightAmbient); Color += g_cEmissive; return float4(Color.rgb, g_cDiffuse.a+Texture.a-1.0f); } //////////////////////////////////// TECHNIQUE T0 { PASS P0 { VertexShader = compile vs_1_1 vs_StdDirLighting(); PixelShader = compile ps_2_0 ps_StdDirLighting(); } } |
C-/C++-Quelltext |
|
1 |
gve::Vector3 vRelDirLightDir = gve::Vector3TransformNormal(gve::Vector3Normalize(vDirLightDir), gve::MatrixTranspose(gve::MatrixInvert(pCurEntry->Data->mTransScaleRotMatrix))); |
Werbeanzeige