D3D11: Wie zeichnet man eine einfache pixel ausgerichtet Zeile?

Ich versuchte, ziehen Sie eine Linie zwischen zwei vertices mit D3D11. Ich habe einige Erfahrungen in der D3D9 und D3D11, aber es scheint ein problem in D3D11 zeichnen Sie eine Linie, die beginnt, in einem bestimmten pixel und endet in einem anderen.

Was ich getan habe:

  1. Ich fügte hinzu, 0.5 f, um die pixel-Koordinaten jedes vertex passen die texel-/pixel-Koordinatensystem (ich Lesen Sie den Microsoft-Seiten zum differeces zwischen D3D9 und D3D11-Koordinatensysteme):

    f32 fOff = 0.5 f;
    ColoredVertex newVertices[2] =
    {
    { D3DXVECTOR3(fStartX + fOff, fStartY + fOff,0), vecColorRGB },
    { D3DXVECTOR3(fEndX + fOff, fEndY + fOff,0), vecColorRGB }
    };

  2. Erzeugt eine ortho-Projektion-matrix passen Sie die render-target:

    D3DXMatrixOrthoOffCenterLH(&MatrixOrthoProj,0.0 f,(f32)uRTWidth,0.0 f,(f32)uRTHeight,0.0 f,1.0 f);
    D3DXMatrixTranspose(&cbConstant.m_matOrthoProjection,&MatrixOrthoProj);

  3. Set RasterizerState, BlendState, Viewport, ...

  4. Draw Vertices als D3D11_PRIMITIVE_TOPOLOGY_LINELIST

Problem:
Die Linie scheint zu sein, ein pixel zu kurz. Es beginnt in der angegebenen pixel-Koordinate einen passt es perfekt. Die Richtung der Linie korrekt aussieht, aber die pixel, wo ich will, dass die Zeile zu Ende ist immer noch nicht farbig. Wie es aussieht ist die Linie nur ein pixel zu kurz...

Ist die jedem tutorial das problem, oder hat jemand das gleiche problem? Soweit ich mich erinnere, war es gar nicht so schwierig, in D3D9.

Fragen Sie nach, wenn Sie weitere Informationen benötigen.

Dank, Stefan

EDIT: gefunden, die Rasterung Regeln für d3d10 (sollte das gleiche für d3d11):
http://msdn.microsoft.com/en-us/library/cc627092%28v=vs.85%29.aspx#Line_1

Ich hoffe das hilft mir beim verstehen...

  • Sie müssen nicht mehr zum einstellen der pixle coords in DX10+, nur eine der vielen Verbesserungen (es ist kein geschehen auf Treiber-Ebene iirc). dieses problem erinnert mich an ein altes OpenGL bug, der existiert mit der Linie, Liste, Zeichnung...
  • wenn ich nicht hinzufügen, 0.5 f, um die Koordinaten, die Linie wird 2px dick, was für mich bedeutet, das es genau zwischen 2 Pixeln in der render-target
  • render-target: 20x20px line vertices: (1,1) -> (18,1) auf das render-target die Linie füllt die Pixel, die von (1,1) zu (17,1) mit der zusätzlichen 0,5 f-Anpassung
  • msdn.microsoft.com/en-us/library/bb205073(v=VS.85).aspx finden Sie unter "zuordnen von Texel zum Pixel". sind Sie verwenden DX11 mit DX9-Schnittstelle durch Zufall(aka D3D_FEATURE_LEVEL_9_x?
  • ich bin mit D3D_FEATURE_LEVEL_11_0 mit der hardware render-Gerät (nvidia geforce gtx 580). die Anpassung erfolgt vor dem vertex-shader zu schlagen, die Mitte eines pixels, also die Koordinaten der Eckpunkte sind (1.5,1.5) und (18.5 und 1.5). da gibt es keinen Unterschied zwischen texel und pixel (die render-target) erfolgt keine Anpassung nach dieser mehr
InformationsquelleAutor sandicz | 2011-05-05
Schreibe einen Kommentar