2010-12-30 13 views
1

Das Problem: Ich bin Rendering ein Netz HLSL mit (High Level Shader Language) in Managed DirectX 9 auf die Komplexität des Netzes Je (Anzahl der Ecken und Flächen) Manchmal bekomme ich Probleme mit dem Flackern.Flickering Mesh-Problem: DirectX HLSL

Offensichtlich sollte ein Netz mit höherer Komplexität länger zum Rendern benötigen, und die Menge an Flimmern steigt mit der Komplexität des Netzes. Was jedoch passiert, ist, dass das Netz überhaupt nicht gerendert wird und die Zeit, die es braucht, um das Netz zu zeichnen ist deutlich niedriger.

Increased Mesh Complexity -> Increased Flickering

Der Kodex:

/* Before this is called: 
    - The Device has been set up successfully 
    - The Effects have been compiled successfully 
    - The RenderState is correct, etc.. etc.. 
*/ 

public void Draw(Device device, MyMeshClass mesh) 
{ 
    // Set vertex/index buffers (this has been timed, negligible) 
    CustomVertex.PositionNormalTextured[] vb = mesh.Vertices; 
    short[] ib = mesh.Indices 

    // Set shader parameters (this has been timed, negligible) 
    this.effect.SetValue("texture", mesh.Texture); 
    this.effect.SetValue("color", mesh.Color); 
    this.effect.SetValue("worldViewProj", mesh.ViewProjection); 

    int passes = this.effect.Begin(0); 
    for (int i = 0; i < passes; ++i) 
    { 
     this.effect.BeginPass(i); 
     device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, ib.Length, ib.Length/3, ib, true, vb); 
     this.effect.EndPass(); 
    } 
    this.effect.End(); 
} 

Ergebnisse: Dies ist der Ausgang I bekommen ist (I eingefügt Timer, die zur besseren Lesbarkeit in dem obigen Code nicht enthalten sind):

// This is a Copy/Paste from the debug output 
. 
. 
Draw Mesh: 1.2851 ms 
Draw Mesh: 1.3882 ms 
Draw Mesh: .4819 ms  // <-- It flickered here 
Draw Mesh: 1.3638 ms 
Draw Mesh: 1.4972 ms 
Draw Mesh: 1.4262 ms 
Draw Mesh: 1.2239 ms 
Draw Mesh: 1.6684 ms 
Draw Mesh: 1.6963 ms 
Draw Mesh: 2.3397 ms 
Draw Mesh: 1.3484 ms 
Draw Mesh: 1.4012 ms 
Draw Mesh: .5287 ms  // <-- It flickered here 
Draw Mesh: .4644 ms  // <-- It flickered here 
Draw Mesh: 1.6140 ms 
Draw Mesh: 1.4392 ms 
Draw Mesh: 1.4579 ms 
Draw Mesh: .4987 ms  // <-- It flickered here 
Draw Mesh: 1.4873 ms 
. 
. 

HLSL-Code: Hier ist die abgekürzt HLSL-Code, bitte beachten Sie, dass dies nicht der eigentliche Code ist also nicht in Syntaxfehler graben, ich versichere Ihnen, der tatsächliche Code ist extrem ähnlich.

Texture texture; 
sampler TextureSampler; // There is more here, I cut it out to save space 
float4x4 worldViewProj : WorldViewProjection; 
float4 color; 


float4 mainVS(float4 pos : POSITION) : POSITION 
{ 
    float4 Out = mul(pos, worldViewProj);   

    return Out; 
} 

float4 mainPS(float4 pos : POSITION) : COLOR 
{ 
    float4 Out = tex2D(TextureSampler, pos.xy); 

    return Out; 
} 


technique Standard 
{ 
    pass One 
    { 
     CullMode = CCW; 
     AlphaBlendEnable = true; 
     SrcBlend = SrcAlpha; 
     DestBlend = InvSrcAlpha; 

     VertexShader = compile vs_2_0 mainVS(); 
     PixelShader = compile ps_2_0 mainPS(); 
    } 
} 

Jede Hilfe/Ideen/Vorschläge würden sehr geschätzt werden. Vielen Dank!

Antwort

0

Die Lösung ist ein VertexBuffer und IndexBuffer und rendern DrawIndexedPrimitives

Verwendung zu verwenden