Du bist nicht angemeldet.

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

Sebastian92

Frischling

  • »Sebastian92« ist der Autor dieses Themas

Beiträge: 33

Wohnort: Wesel

Beruf: Azubi (Fachinformatiker für Anwendungsentwicklung)

  • Private Nachricht senden

11

23.08.2009, 00:49

OK habs nu geschafft.

Hier der Shader der Funktioniert:

C-/C++-Quelltext

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
matrix mWorldViewProj;
matrix mLightViewProj;

Texture2D ColorDef;
Texture2D Layer1;
Texture2D Layer2;
Texture2D Layer3;
Texture2D Layer4;

Texture2D ShadowTex;

float       fShadMapSize = 512.0f;

SamplerState linearSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

shared RasterizerState noCullRS
{
    CullMode = None;
    FillMode = Solid;
    MultisampleEnable = false;
};
/*************************************************************
Colored,Shaded Terrain
*************************************************************/

struct a2v_Shaded {
    float4 Pos          : POSITION;
    float2 TexCoord     : TEXCOORD0;
    float2 DetailCoord  : TEXCOORD1;
};

struct v2p_Shaded {
    float4  Pos             : SV_POSITION;
    float2  TexCoord        : TEXCOORD0;
    float2  DetailCoord     : TEXCOORD1;
    float4  lightViewPos    : LIGHT;
};

void VS_Shaded( in a2v_Shaded IN, out v2p_Shaded OUT) {
    float4 Pos = IN.Pos;
    OUT.Pos = mul(Pos,mWorldViewProj);
    OUT.TexCoord = IN.TexCoord;
    OUT.DetailCoord = IN.DetailCoord;
    OUT.lightViewPos = mul(Pos,mLightViewProj);
}

float4 ComputeColor( in v2p_Shaded IN)
{
    float4 ColorAlpha = ColorDef.Sample(linearSampler,IN.TexCoord);
    float4 Color1 = Layer1.Sample(linearSampler,IN.DetailCoord);
    float4 Color2 = Layer2.Sample(linearSampler,IN.DetailCoord);
    float4 Color3 = Layer3.Sample(linearSampler,IN.DetailCoord);
    float4 Color4 = Layer4.Sample(linearSampler,IN.DetailCoord);

    return (Color1 * ColorAlpha.r) + (Color2 * ColorAlpha.g) + (Color3 * ColorAlpha.b) + (Color4 * ColorAlpha.a);
}

float4 PS_Shaded( in v2p_Shaded IN): SV_Target
{
    float4 lightViewPos = IN.lightViewPos;
    lightViewPos.xy /= lightViewPos.w;
    float2 tex = lightViewPos.xy * float2( 0.5f, -0.5f ) + 0.5f;
    
    float fA = lightViewPos.z/lightViewPos.w;
    
    float fShad = 0.0f;
    for(int x=-1;x<2;x++)
        for(int y=-1;y<2;y++)
        {
            fB = ShadowTex.Sample(linearSampler,tex.xy + float2(x/fShadMapSize,y/fShadMapSize)).r;
            if( ((fA-0.0001) <= fB))
                fShad += 1.0f;
        }
                
    fShad /= 9.0f;
    
    return ComputeColor(IN) * fShad;
}

technique10 Shaded
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS_Shaded() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS_Shaded() ) );
        
        SetRasterizerState( noCullRS );
    }
}

/*************************************************************
Shadow
*************************************************************/
struct a2v_Shadow {
    float4 Pos          : POSITION;
    float2 TexCoord     : TEXCOORD0;
    float2 DetailCoord  : TEXCOORD1;
};

struct v2p_Shadow {
    float4 Pos          : SV_POSITION;
    float4 Light        : LIGHT;
};

void VS_Shadow( in a2v_Shadow IN, out v2p_Shadow OUT) {
    OUT.Pos = mul(IN.Pos,mLightViewProj);
    OUT.Light = mul(IN.Pos,mLightViewProj);
}

float4 PS_Shadow( in v2p_Shadow IN): SV_Target
{
    float fDepth = IN.Light.z/IN.Light.w;
    return float4(fDepth,fDepth,fDepth,1.0f);
}

technique10 Shadow
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS_Shadow() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS_Shadow() ) );
        
        SetRasterizerState( noCullRS );
    }
}


Danke und Gruß
Sebastian

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

12

24.08.2009, 22:39

thx for sharing;),
wird leider viel zu selten gemacht, den funktionierenden code zum schluss noch mal zu zeigen, da es immer jemanden geben wird, der das gleiche problem hat