2010-12-30 4 views
1

Проблема: Я рендеринга сетки с помощью HLSL (High Level Shader Language) в управляемом DirectX 9. В зависимости от сложности сетки (число вершин и граней) У меня иногда возникают проблемы с мерцанием.Мерцание Mesh Проблема: DirectX HLSL

Очевидно, что сетка с более высокой степенью сложности должна занимать больше времени, а количество мерцания увеличивается со сложностью сетки. Однако происходит то, что сетка не отображается вообще и время, необходимое для рисования сетки значительно ниже.

Increased Mesh Complexity -> Increased Flickering

Кодекс:

/* 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(); 
} 

Результаты: Это выход я получаю (я вставил таймеры, которые не включены в приведенный выше код для удобочитаемости):

// 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: Вот сокращенный код HLSL, обратите внимание, что это НЕ настоящий код, поэтому не копайте в синтаксические ошибки, я заверяю вас, что фактический код очень схож.

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(); 
    } 
} 

Любая помощь/идеи/предложения были бы высоко оценены. Благодаря!

ответ

0

Решение состоит в том, чтобы использовать VertexBuffer и IndexBuffer и визуализации с помощью DrawIndexedPrimitives

Смежные вопросы