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

11

06.09.2012, 12:31

Ich würde dir sehr gern helfen, aber ich lese mir den C# Quelltext solange nicht durch, bis der ordentlich formatiert ist :)

12

06.09.2012, 12:35

Hi, Dannke.

Ich füge es richtig ein, wenn ich es poste zerschießt sich alles...
Also füge ich es mal so ein:


private void DrawTerrain(Matrix currentViewMatrix)
{
effect.CurrentTechnique = effect.Techniques["Colored"];
Matrix worldMatrix = Matrix.Identity;
effect.Parameters["xWorld"].SetValue(worldMatrix);
effect.Parameters["xView"].SetValue(currentViewMatrix);
effect.Parameters["xProjection"].SetValue(projectionMatrix);

effect.Parameters["xEnableLighting"].SetValue(true);
effect.Parameters["xAmbient"].SetValue(0.4f);
effect.Parameters["xLightDirection"].SetValue(new Vector3(-0.5f, -1, -0.5f));

//effect.Begin();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
//pass.Begin();

//device.Vertices[0].SetSource(terrainVertexBuffer, 0, VertexPositionNormalColored.SizeInBytes);
device.SetVertexBuffer(terrainVertexBuffer);
device.Indices = terrainIndexBuffer;
//device.VertexDeclaration = terrainVertexDeclaration;

int noVertices = terrainVertexBuffer.SizeInBytes / VertexPositionNormalColored.SizeInBytes;
int noTriangles = terrainIndexBuffer.SizeInBytes / sizeof(int) / 3;
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, noVertices, 0, noTriangles);

//pass.End();
}
//effect.End();
}


Fehler im kursiv gedruckten.
Bilder zu meinem Projekt: ParSim

13

06.09.2012, 12:52

Wie schon in der Fehlerbeschreibung beschrieben, existiert die Definition von "SizeInBytes" bei dem Vertex- und Indexbuffer nicht.
Ich kenne jetzt nicht das Tutorial, aber vermutlich wird dies über XNA 3 handeln. Du verwendest vermutlich XNA 4?

Dort gibt es eine Eigenschaft namens "VertexCount" für den VertexBuffer. Beim IndexBuffer lautet dies analog dazu "IndexCount".

14

06.09.2012, 13:14

Hi,

Zitat

Ich kenne jetzt nicht das Tutorial, aber vermutlich wird dies über XNA 3 handeln. Du verwendest vermutlich XNA 4?
Ja ganz genau.

Deine Lösung hat funktioniert. :)


Leider gibt es jetzt einen anderen Fehler :D
Bei:

device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, noVertices, 0, noTriangles);


Fehler:
Both a vertex shader and pixel shader must be set on the device before any draw operations may be performed.

hmm..
Bilder zu meinem Projekt: ParSim

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Horus« (06.09.2012, 13:21)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

06.09.2012, 13:32

Zeig mal den Code wo die Shader ausgeführt werden. Möglicherweise ist da was falsch.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

16

06.09.2012, 14:34

Zitat

Both a vertex shader and pixel shader must be set on the device before any draw operations may be performed.
Das kann daran liegen, dass das Shaderprogramm noch nicht "aktiviert" wurde.
Am besten rufst du effect.Technique[0].Pass[0].apply() auf und dann sollte das auch klappen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

06.09.2012, 14:45

Achja, hier mal ein Blick auf die Straßen einer simulierten Stadt! Keine Texturen kein 3D...

Das sieht zwar ähnlich aus wie das Bahn-Netz in Frankreich oder Stuttgart, aber ein Straßennetz einer Stadt sieht eigentlich weniger zentralistisch aus als das. Es gibt da viele Arme in dem Bild, die lange Strecken über das Zentrum brauchen, damit man zum jeweils anderen Arm kommt. So sehen Straßen eher nicht aus.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

18

06.09.2012, 16:51

Hi,

Zitat

Das sieht zwar ähnlich aus wie das Bahn-Netz in Frankreich oder Stuttgart, aber ein Straßennetz einer Stadt sieht eigentlich weniger zentralistisch aus als das. Es gibt da viele Arme in dem Bild, die lange Strecken über das Zentrum brauchen, damit man zum jeweils anderen Arm kommt. So sehen Straßen eher nicht aus.
Ja das stimmt. Die Menschen in dieser Stadt leben sehr Zentralistisch ;)

Spaß beiseite, der Algorithmus für den Straßenbau ist archaisch. Aber das Framework auf dem er basiert, auf dem auch Vegetation basieren wird usw. das ist sehr belastbar. Falls du Interesse hast dir das mal anzusehen poste die Engine-Klasse. Da nutze ich sogar eine ping-pong - Methode :D

Es gibt bestimmt trotzdem viel zu verbessern :P

Wenn die Grafik steht dann mache ich mich da wieder ran.







...effect.Techniques[0].Passes[0].Apply();

Hat leider nichts verändert.


Zitat

Zeig mal den Code wo die Shader ausgeführt werden. Möglicherweise ist da was falsch.
Ich hoffe das ist jetzt das richtige, die .fx Datei:




//----------------------------------------------------
//-- --
//-- www.riemers.net --
//-- Series 4: Advanced terrain --
//-- Shader code --
//-- --
//----------------------------------------------------

//------- Constants --------
float4x4 xView;
float4x4 xProjection;
float4x4 xWorld;
float3 xLightDirection;
float xAmbient;
bool xEnableLighting;

//------- Texture Samplers --------

Texture xTexture;

sampler TextureSampler = sampler_state { texture = <xTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
//------- Technique: Colored --------
struct ColVertexToPixel
{
float4 Position : POSITION;
float4 Color : COLOR0;
float LightingFactor: TEXCOORD0;
};

struct ColPixelToFrame
{
float4 Color : COLOR0;
};

ColVertexToPixel ColoredVS( float4 inPos : POSITION, float4 inColor: COLOR, float3 inNormal: NORMAL)
{
ColVertexToPixel Output = (ColVertexToPixel)0;
float4x4 preViewProjection = mul (xView, xProjection);
float4x4 preWorldViewProjection = mul (xWorld, preViewProjection);

Output.Position = mul(inPos, preWorldViewProjection);
Output.Color = inColor;

float3 Normal = normalize(mul(normalize(inNormal), xWorld));
Output.LightingFactor = 1;
if (xEnableLighting)
Output.LightingFactor = saturate(dot(Normal, -xLightDirection));

return Output;
}

ColPixelToFrame ColoredPS(ColVertexToPixel PSIn)
{
ColPixelToFrame Output = (ColPixelToFrame)0;

Output.Color = PSIn.Color;
Output.Color.rgb *= saturate(PSIn.LightingFactor + xAmbient);

return Output;
}

technique Colored
{
pass Pass0
{
VertexShader = compile vs_2_0 ColoredVS();
PixelShader = compile ps_2_0 ColoredPS();
}
}

//------- Technique: Textured --------
struct TexVertexToPixel
{
float4 Position : POSITION;
float4 Color : COLOR0;
float LightingFactor: TEXCOORD0;
float2 TextureCoords: TEXCOORD1;
};

struct TexPixelToFrame
{
float4 Color : COLOR0;
};

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

Output.Position = mul(inPos, preWorldViewProjection);
Output.TextureCoords = inTexCoords;

float3 Normal = normalize(mul(normalize(inNormal), xWorld));
Output.LightingFactor = 1;
if (xEnableLighting)
Output.LightingFactor = saturate(dot(Normal, -xLightDirection));

return Output;
}

TexPixelToFrame TexturedPS(TexVertexToPixel PSIn)
{
TexPixelToFrame Output = (TexPixelToFrame)0;

Output.Color = tex2D(TextureSampler, PSIn.TextureCoords);
Output.Color.rgb *= saturate(PSIn.LightingFactor + xAmbient);

return Output;
}

technique Textured
{
pass Pass0
{
VertexShader = compile vs_2_0 TexturedVS();
PixelShader = compile ps_2_0
TexturedPS();
}
}



... leider kann ich den Code nicht als Code posten, zerschießt sich.


Ich kann auch das ganze Projekt hochladen oder so.



LG
Bilder zu meinem Projekt: ParSim

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

19

06.09.2012, 17:23

Es geht um den C# Code in dem der Shader eingebunden und ausgeführt wird. Da wo auch effect.Techniques[0].Passes[0].Apply(); steht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

20

06.09.2012, 17:30

Oh alles klar. Da scheint etwas nicht zu stimmen, das steht nirgendwo... :wacko:



effect wird deklariert:
Effect effect;



Wird geladen:

protected override void LoadContent()
{
device = GraphicsDevice;

effect = Content.Load<Effect>("Series4Effects");
viewMatrix = Matrix.CreateLookAt(new Vector3(130, 30, -50), new Vector3(0, 0, -40), new Vector3(0, 1, 0));
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 0.3f, 1000.0f);

LoadVertices();
}


Und dann in der Draw bzw. DrawTerrain erfolglos aufgerufen:


protected override void Draw(GameTime gameTime)
{
float time = (float)gameTime.TotalGameTime.TotalMilliseconds / 100.0f;
//device.RenderState.CullMode = CullMode.None;

device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1.0f, 0);
DrawTerrain(viewMatrix);

base.Draw(gameTime);
}

private void DrawTerrain(Matrix currentViewMatrix)
{
effect.CurrentTechnique = effect.Techniques["Colored"];
Matrix worldMatrix = Matrix.Identity;
effect.Parameters["xWorld"].SetValue(worldMatrix);
effect.Parameters["xView"].SetValue(currentViewMatrix);
effect.Parameters["xProjection"].SetValue(projectionMatrix);

effect.Parameters["xEnableLighting"].SetValue(true);
effect.Parameters["xAmbient"].SetValue(0.4f);
effect.Parameters["xLightDirection"].SetValue(new Vector3(-0.5f, -1, -0.5f));

//effect.Techniques[0].Passes[0].Apply(); //Zugefügt, hilft leider nicht!

//effect.Begin();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
//pass.Begin();

//device.Vertices[0].SetSource(terrainVertexBuffer, 0, VertexPositionNormalColored.SizeInBytes);
device.SetVertexBuffer(terrainVertexBuffer);
device.Indices = terrainIndexBuffer;
//device.VertexDeclaration = terrainVertexDeclaration;

int noVertices = terrainVertexBuffer.VertexCount / VertexPositionNormalColored.SizeInBytes;
int noTriangles = terrainIndexBuffer.IndexCount / sizeof(int) / 3;
device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, noVertices, 0, noTriangles);

//pass.End();
}
//effect.End();
}

:|
Bilder zu meinem Projekt: ParSim

Werbeanzeige

Ähnliche Themen