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

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

1

25.04.2007, 18:11

Multitexturing Frage

Ich schreibe gerade den Terrainteil meiner Engine und wollte nun einen Überlauf zwischen verschiedenen Bodentexturen hinbekommen und zwar ohne Volumentexturen (Speicheraufwand zu groß). Dabei soll ein Patch (64*64Vertizen) bis zu 4 Texturen besitzen und zwischen ihnen interpolieren können (bei jedem einzelnen Vertex).
Mit D3DTOP_BLENDDIFFUSEALPHA geht das zwischen 2 Texturen aber was ist mit vier?
Alphawert = 0.8 bedeutet ja eine Interpolation zwischen 3. und 4. Schicht von den anderen gar nichts.
Weiß jemand wie man das mit Renderstates usw. (keine Shader) realisieren könnte?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

27.04.2007, 17:33

naja, das problem ist: woher nimmst du 3 verschiedene blending faktoren in der ffp? du könntest versuchen die diffuse und specular farben zu missbrauchen. notfalls kanns du dir auch eine textur machen die über den ganzen terrain patch gezogen wird und halt einen per pixel blending faktor hat.
mit shadern wär das total einfach (und vermutlich auch performanter...)

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

3

28.04.2007, 14:22

Eine Textur pro patch ist viel zu Speicher und Performenc Verschwendung und der Missbrauch würde auch nur mit Shadern gehen.
Bleibt mir wohl nichts anderes übrig als Shaderunterstützung vorrauszusetzen (oder nur zwei Texturen mal sehen ob's auch reicht).
Naja ist wahrscheinlich ohne Shader unmöglich.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.04.2007, 14:28

ich würds auf jeden fall mit shadern machen. du brauchst eh nur vertex shader, und die kann dx emulieren falls nicht vorhanden. außerdem kannst du heutzutage min shader model 1.1 voraussetzen (das hat praktisch jeder) und mehr brauchst du nicht.
oft nimmt man übrigens die y koordinate des normalvektors an der entsprechenden stelle als überblendungsfaktor. so kann man z.b. je nach hangneigung zwischen gras und stein blenden.

5

28.04.2007, 14:46

ich hatte mal das selbe problem:

Lsg: Du musst Shader nutzen. Wie dot bereits sagte funzt wuderbar mit 1.1

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
// Variablen

// Matrix

float4x4 matWorldViewProj;
int iNumTextures = 4;
string strTexturename0 = "Gras.dds";
string strTexturename1 = "Sand.dds";
string strTexturename2 = "Laub.dds";
string strTexturename3 = "Schnee.dds";

// texture1

texture Texture1;
sampler TextureSampler1 = sampler_state {
   Texture = <Texture1>;
};
// texture2

texture Texture2;
sampler TextureSampler2 = sampler_state {
   Texture = <Texture2>;
};
// texture3

texture Texture3;
sampler TextureSampler3 = sampler_state {
   Texture = <Texture3>;
};
// texture

texture Texture4;
sampler TextureSampler4 = sampler_state {
   Texture = <Texture4>;
};

// -------------------------------------------------------------

// vertex shader output channels

// -------------------------------------------------------------

struct VS_OUTPUT
{
   float4 Pos: POSITION;
   float2 TexCoords0: TEXCOORD0;
   float2 TexCoords1: TEXCOORD1;
   float4 Color0: COLOR0;
};

struct VS_INPUT
{
    float4 Pos: POSITION;
    float2 TexCoords : TEXCOORD0;
    float4 Proportion : COLOR0;
} Vertex : VERTEXDECL;

// -------------------------------------------------------------

// vertex shader function (input channels)

// -------------------------------------------------------------


VS_OUTPUT VS( float4 Pos: POSITION, float2 TexCoords : TEXCOORD0, float4 Proportion : COLOR0)
{
   VS_OUTPUT Out = (VS_OUTPUT) 0; 
   Out.Pos = mul(Pos, matWorldViewProj); // transform Position

   Out.TexCoords0 = TexCoords;
   Out.Color0 = Proportion;
   return Out;
}

// -------------------------------------------------------------

// Pixel Shader (input channels):output channel

// -------------------------------------------------------------

float4 PS(float2 Tex: TEXCOORD0, float4 Color0: COLOR0) : COLOR
{
  return ( tex2D(TextureSampler1, Tex) * Color0.x + tex2D(TextureSampler2, Tex) * Color0.y +  tex2D(TextureSampler3, Tex) * (Color0.z) + tex2D(TextureSampler4, Tex) * (Color0.w));
}

// -------------------------------------------------------------

// Name technique | pass | how to compile 

// -------------------------------------------------------------

technique TShader
{
    pass P0
    {
        // Texturen setzen

    Sampler[0] = (TextureSampler1);
    Sampler[1] = (TextureSampler2);
    Sampler[2] = (TextureSampler3);
    Sampler[3] = (TextureSampler4);
        // compiler directives

        VertexShader = compile vs_1_1 VS();
        PixelShader  = compile ps_1_4 PS();
    }
}



Das tolle ist die COLOR0 wird automatisch durch DX interpoliert. Dann einfach im PixelShader die Texturverhältnisse berechnen.
Du musst allerdings wie VS_INPUT gezeigt, den Vertex um eine farbe erweitern. Diese Farbe (4xfloat) enthält einach die Verhältnisse der 4 Texturen zueinander, wobei diese bei dieser rechnung normalisiert sein sollten.

Wegen Speicher: du brauchst nur 2 - 4 Texturen laden, je nachdem wieviele du interpolieren willst. Gehts noch kleiner? :)

Das wars! Schnell und gutaussehend!

mfgf Markus

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

6

28.04.2007, 14:46

Warum nur Vertexshader ich würde eher sagen nur Pixelshader es ist ja nicht das Problem den Blendfaktor zu bestimmen, sondern zwischen 4 Texturen zu Blenden alse eher einen Pixelshader:
lerp(lerp(tex1, tex2, Blendfaktor*4-3), lerp(tex3, tex4, Blendfaktor*4-1), Blendfaktor*2-1)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

28.04.2007, 14:57

Zitat von »"jojendersie"«

Warum nur Vertexshader


:roll: berechtigter einwand

mein fehler. es is für mich einfach viel zu selbstverständlich shader zu verwenden^^
da hab ich zu kurz gedacht, denn die ffp fangt nicht viel mit dem was der vertex shader ausspuckt an...

also ja, man braucht beides. pixel und vertex shader.

übrigens mit multi pass rendering bekommst du's auch ohne shader hin. das hab ich vorhin auch noch vergessen^^

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

8

28.04.2007, 15:00

Danke. lannms11 bis zu wie vielen texturen geht denn ps1_4 mit und bis zu wie vielen ps1_1?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

28.04.2007, 15:02

ps_1_0 bis ps_1_3 max 4
ps_1_4 max 6

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

10

28.04.2007, 15:02

Ich habe mal gleich noch eine Frage in irgendeinem Gems4 Beispiel ist der Shader in Opcode enthalten, und wird direkt gesetzt (ohne kompilieren). Gibt es irgendeinen weg das einfach hinzubekommen?

Werbeanzeige