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

51

10.09.2012, 17:43

OK dann ahbe ich schon eine vielleicht einfache Frage :D

Es geht um die TextureWeights. Zum Multitexturung.

Diese sind in den Vertices als Vector4.w bis z deklariert. Das geht so nicht weil 4 zu wenig sind.

Ich will die TextureWeights als float array deklarieren.
So weit klappt das alles in der Grafikklasse.

Jedoch scheint der Schader auf den Array nicht zugreifen zu können.

Auch gelingt es nicht die
float4 TextureWeights : TEXCOORD3;
als
float4 TextureWeights[4] : TEXCOORD3;

zu deklarieren.

Wie könnte man das lösen?

Muss ich TextureWeights01, TextureWeights02 usw alle einzeln deklarieren? Ich hoffe nicht.

Shader fürs Multitexturing folgt:


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
//------- Technique: Multitextured --------
struct MTVertexToPixel
{
float4 Position : POSITION;
float4 Color : COLOR0;
float3 Normal : TEXCOORD0;
float2 TextureCoords : TEXCOORD1;
float4 LightDirection : TEXCOORD2;
float4 TextureWeights : TEXCOORD3;
float Depth : TEXCOORD4;

};

struct MTPixelToFrame
{
float4 Color : COLOR0;
};

MTVertexToPixel MultiTexturedVS( float4 inPos : POSITION, float3 inNormal: NORMAL, float2 inTexCoords: TEXCOORD0, float4 inTexWeights: TEXCOORD1)
{ 
MTVertexToPixel Output = (MTVertexToPixel)0;
float4x4 preViewProjection = mul (xView, xProjection);
float4x4 preWorldViewProjection = mul (xWorld, preViewProjection);

Output.Position = mul(inPos, preWorldViewProjection);
Output.Normal = mul(normalize(inNormal), xWorld);
Output.TextureCoords = inTexCoords;
Output.LightDirection.xyz = -xLightDirection;
Output.LightDirection.w = 1; 
Output.TextureWeights = inTexWeights;

Output.Depth = Output.Position.z/Output.Position.w;


return Output;
}

MTPixelToFrame MultiTexturedPS(MTVertexToPixel PSIn)
{
MTPixelToFrame Output = (MTPixelToFrame)0; 

float lightingFactor = 1;
if (xEnableLighting)
lightingFactor = saturate(saturate(dot(PSIn.Normal, PSIn.LightDirection)) + xAmbient);


float blendDistance = 0.99f;
float blendWidth = 0.005f;
float blendFactor = clamp((PSIn.Depth-blendDistance)/blendWidth, 0, 1);

float4 farColor;
farColor = tex2D(TextureSampler0, PSIn.TextureCoords)*PSIn.TextureWeights[0];
farColor += tex2D(TextureSampler1, PSIn.TextureCoords)*PSIn.TextureWeights[1];
farColor += tex2D(TextureSampler2, PSIn.TextureCoords)*PSIn.TextureWeights[2];
farColor += tex2D(TextureSampler3, PSIn.TextureCoords)*PSIn.TextureWeights[3];

float4 nearColor;
float2 nearTextureCoords = PSIn.TextureCoords*5;
nearColor = tex2D(TextureSampler0, nearTextureCoords)*PSIn.TextureWeights[0];
nearColor += tex2D(TextureSampler1, nearTextureCoords)*PSIn.TextureWeights[1];
nearColor += tex2D(TextureSampler2, nearTextureCoords)*PSIn.TextureWeights[2];
nearColor += tex2D(TextureSampler3, nearTextureCoords)*PSIn.TextureWeights[3];

Output.Color = lerp(nearColor, farColor, blendFactor);
Output.Color *= lightingFactor;


return Output;
}

technique MultiTextured
{
pass Pass0
{
VertexShader = compile vs_2_0 MultiTexturedVS();
PixelShader = compile ps_2_0 MultiTexturedPS();
}
} 
Bilder zu meinem Projekt: ParSim

52

10.09.2012, 18:17

Jetzt versteh ich garnichts mehr aber es geht.


So sind die TextWeights im Vertex struct deklariert:

Quellcode

1
public TextureWeights TexWeights;



So sie der Strukt für den Typ aus:

Quellcode

1
        private struct TextureWeights        {            public float A;            public float B;            public float C;            public float D;        }




Und jetzt kommts!!!
So greife ich in der HLSL datei auf die Texweights zu:

Quellcode

1
2
3
4
farColor = tex2D(TextureSampler0, PSIn.TextureCoords)*PSIn.TextureWeights[0];
farColor += tex2D(TextureSampler1, PSIn.TextureCoords)*PSIn.TextureWeights[1];
farColor += tex2D(TextureSampler2, PSIn.TextureCoords)*PSIn.TextureWeights[2];
farColor += tex2D(TextureSampler3, PSIn.TextureCoords)*PSIn.TextureWeights[3];



Das dürfte doch niemals Funkltionieren!
Tuts aber.

:wacko:


Wenn ich so zugreife:

Quellcode

1
farColor = tex2D(TextureSampler0, PSIn.TextureCoords)*PSIn.TextureWeights.A; 


usw.

Dann geht es nicht.

Ich muss also auf die Member wie auf einen Array zugreifen. Was ist das für ein unlogischer Unsinn! :cursing:
Bilder zu meinem Projekt: ParSim

53

10.09.2012, 23:33

HLSL Shader umzuprogrammieren habe ich nicht auf Anhieb hinbekommen, das ist irgendwie kompliziert.

AAAABER:
jetzt geht Multitexturing mit 8 Texturen, hier sind schonmal 5, die anderen 3 sind angelegt. :D ( Es könnte eine Straße sein)



Wann steigen eigentlich mal per Leute mit ein? Die Bilder reichen wohl nicht oder was?


Kann mal jemand den Vertex Struckt angucken? So ganz zufrieden bin ich nicht.

private struct VertexMultitextured : IVertexType
{
public Vector3 Position;
public Vector3 Normal;
public Vector4 TextureCoordinate;
public Vector4 TexWeights1;
public Vector4 TexWeights2;

public static int SizeInBytes = (3 + 3 + 4 + 4 + 4 ) * sizeof(float);

public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
(
new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
new VertexElement(sizeof(float) * 3, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0),
new VertexElement(sizeof(float) * 6, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 0),
new VertexElement(sizeof(float) * 10, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 1),
new VertexElement(sizeof(float) * 14, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 2)

);

VertexDeclaration IVertexType.VertexDeclaration { get { return VertexDeclaration; } }
};


Unterstrichen sind die Vertex Elements für die Textur-Gewichtungen TexWeights. Es sind 2 Vector4 Variablen. Gibt es da nicht eine schönere Methode?
Leider bekomme ich das nicht mit einem Array hin. Ist das nicht möglich?
Auch mit einem eigenen Struct geht es nicht.
VertexElementFormat kenn kein float oder?

Viele Grüße
Bilder zu meinem Projekt: ParSim

54

11.09.2012, 07:19

*PSIn.TextureWeights.A;
Das geht nicht, weil es wenn dann .a sein müsste; oder .w das geht auch.

Zitat

Auch gelingt es nicht die
float4 TextureWeights : TEXCOORD3;
als
float4 TextureWeights[4] : TEXCOORD3;
Da kann ich mir vorstellen, dass ein ganz anderes Problem dies verhindert. Sieh mal in deinen Shader. Dort hast du zustehen: "float Depth : TEXCOORD4;".
Dies wäre dann aber falsch, da du ja vorher ein Array deklariert hast.
float4 TextureWeights[4] : TEXCOORD3; würde somit alle Texcoords von 3 bis 6 belegen. Damit ist:
float Depth : TEXCOORD7

Zitat

Wann steigen eigentlich mal per Leute mit ein? Die Bilder reichen wohl nicht oder was?
Das liegt daran, dass wahrscheinlich keiner so genau weiß, wie du denn überhaupt intern weiterentwickeln möchtest. Das sieht mir mehr nach einem Projekt aus, welches du allein besser entwickeln kannst.

55

11.09.2012, 07:50

Aha,
danke,
ich werde direkt mal rumprobieren. Mit einem Array:love: das wäre ganz nach meinem Gusto.

Das mit den TEXCOORDs hatte ich vorher nicht so ganz kapiert.

Aber momentan sehe ich noch ein Problem hier:

public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration
(
new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
new VertexElement(sizeof(float) * 3, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0),
new VertexElement(sizeof(float) * 6, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 0),
new VertexElement(sizeof(float) * 10, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 1),
new VertexElement(sizeof(float) * 14, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 2)
);


VertexElementFormat kennt kein .float somit auch kein floaf[] oder verstehe ich das falsch ?(

Wenn die VertexElement nicht stimmen kackt mit immer der Vertexbuffer ab, hat dann falsche Größe. Na kein Wunder.



Zitat

Das liegt daran, dass wahrscheinlich keiner so genau weiß, wie du denn überhaupt intern weiterentwickeln möchtest. Das sieht mir mehr nach einem Projekt aus, welches du allein besser entwickeln kannst.
Ja ok. Das wird bald klarer, hoffe ich.
Bilder zu meinem Projekt: ParSim

CodeBase

Treue Seele

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

56

11.09.2012, 08:19

Wann steigen eigentlich mal per Leute mit ein? Die Bilder reichen wohl nicht oder was?
Du kannst nicht erwarten das die Leute sagen "Hey der hat Bilder, ich steig mit ein" ;). Vll. schreibst du mal alles besser zusammen was genau du machen willst und vorallem was du genau suchst. Kannst nicht erwarten das sich Leute einfach so bei dir melden :). Gib ihnen Futter und mach dein Projekt schmackhaft. In der Hobbyszene ist es nicht so einfach Leute für ein Projekt zu gewinnen wenn du a) nicht genau schreibst was du genau vorhast und b) keine bezahlung bietest. Du kannst nicht erwarten das Leute für nichts mit dir am Projekt arbeiten wenn du nicht einmal genau beschreibst was es werden soll :). Mach mal ein Konzept schreibe alles nieder, was soll man als "Gott" machen können ? Welche Epochen gibt es ? Multiplayer ? Singleplayer ? usw. usw.

EcaFaYn!

Frischling

Beiträge: 62

Wohnort: NRW

Beruf: Azubi + Student

  • Private Nachricht senden

57

11.09.2012, 08:32

Ach, die Bilder machen das eigentlich schon "schmackhaft", vor allem wenn so schnell Fortschritte entstehen. Aber ein paar konzeptionelle Richtlinien und Ziele wären sicher gut.
On the grind - Supersci

58

11.09.2012, 09:24

Die TextureWeights fürs Multitexturing bleiben etwas Undurchsichtig. Geht nicht anders.

Ich glaube einen Array für die Textureweights kann man nicht benutzen, denn VertexElementFormat kennt kein .float.


@Palmaschin, die HLSL konnte ich vie du vorgeschlagen hattest ändern. Nur leider nicht testen.



Ohne Pasende Vertexelements kann ich nichts in den Buffer kopieren. Die Ausgabe zerschießt sich auch.
Da es kein float gibt, geht es auch so nicht:

float TextureWeight1
float TextureWeight2
bleiben nur vector2, verctor3 und vector4... 2 mal vector4 ist da noch das kleinste Übel.

Da die Grafik so weit im Wesentlchen fertig ist, ist der 2. Schritt fertig


Wie geht es weiter?
Ich werde jetzt den Stadtbau-Algorithmus integrieren.
Dann kommen bessere Models. Mit Milkshape habe ich diese gemacht. Damit komme ich garnicht klar.


Zum genauen Speilablauf:
Ich werde mal etwas schreiben wo es alles genau erklärt ist. Mal par kurze Gedanken.

Gott wird in einer Welt sein die sich um ihn herum entwickelt. Aber als Gott kann er eingreifen.
Die Städte die dort wachsen werden recht sensible Wirtschaftssysteme haben. Sie werden auf Ressourcen angewiesen sein, wichtige Infrastruktur haben.
Dort kann Gott helfen oder zerstören.

Ein Vulkanausbruch zerstört, er macht das Land aber fruchtbar.
Meteoriten hinterlassen Metallvorkommen.
Eine Entwicklung von Techologie usw bei der Civilisation wäre denkbar. Gott könnte, sie in die Steinzeit zurück befördern :D
Regen und Trockenheit wird auch in Gottes Hand liegen.
Ohne Gott werden die Menschen sterben, wenn er es will auch.

Es ist somit ein Simulationsspiel. Ich denke Gottes Mana wird von gebeten gespeist. Es Wird also Kirchen geben.
Eine Mischung aus Civilisation, SimCity und Black&White aber mehr auf Simulation.

So genau weiß ich noch nicht wo das hinführt. Aber ich finde das nicht so wichtig. Ist kein klassisches Spiel / Spiele-Projekt. Das ist schon was neues denke ich.

Denke die Vermarktung läuft über Youtube Videos und Foren. So ein Spiel gibt es ja bisher nicht.
Bilder zu meinem Projekt: ParSim

CodeBase

Treue Seele

Beiträge: 98

Wohnort: Österreich -> Salzburg

Beruf: Datenbank Entwickler

  • Private Nachricht senden

59

11.09.2012, 09:35

Denke die Vermarktung läuft über Youtube Videos und Foren. So ein Spiel gibt es ja bisher nicht.
Nicht ganz richtig ;) http://de.wikipedia.org/wiki/Black_%26_White

aber schaut schon mal cool aus und bist echt schnell mit dem entwickeln. Blöde frage.... woher kannst du das ? Selber beigebracht ? Hast du damit Beruflich zu tun ?

60

11.09.2012, 10:01

Hi,
also beruflich habe ich mit vba und Accesss zu tun und so. Alles selber beigebracht.
C# und XNA mache ich jetzt nur so zum Spass. Ist ja nicht so schwierig. ^^
Bilder zu meinem Projekt: ParSim

Werbeanzeige

Ähnliche Themen