Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

D3D11: How to draw a simple pixel aligned line?

Tags:

c++

directx-11

I tried to draw a line between two vertices with D3D11. I have some experiences in D3D9 and D3D11, but it seems to be a problem in D3D11 to draw a line, which starts in one given pixel and ends in an other.

What I did:

  1. I added 0.5f to the pixel coordinates of each vertex to fit the texel-/pixel coordinate system (I read the Microsoft pages to the differeces between D3D9 and D3D11 coordinate systems):

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

  2. Generated a ortho projection matrix to fit the render target:

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

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

  4. Draw Vertices as D3D11_PRIMITIVE_TOPOLOGY_LINELIST

Problem: The Line seems to be one pixel to short. It starts in the given pixel coordinate an fits it perfect. The direction of the line looks correct, but the pixel where I want the line to end is still not colored. It looks like the line is just one pixel to short...

Is the any tutorial explaining this problem or does anybody have the same problem? As I remember it wasn't as difficult in D3D9.

Please ask if you need further information.

Thanks, Stefan

EDIT: found the rasterization rules for d3d10 (should be the same for d3d11): http://msdn.microsoft.com/en-us/library/cc627092%28v=vs.85%29.aspx#Line_1

I hope this will help me understanding...

like image 738
sandicz Avatar asked May 05 '11 13:05

sandicz


1 Answers

According to the rasterisation rules (link in the question above) I might have found a solution that should work:

  1. sort the vertices StartX < EndX and StartY < EndY
  2. add (0.5/0.5) to the start vertex (as i did before) to move the vertex to the center of the pixel
  3. add (1.0/1.0) to the end vertex to move the vertex to the lower right corner

This is needed to tell the rasterizer that the last pixel of the line should be drawn.

f32 fXStartOff = 0.5f;
f32 fYStartOff = 0.5f;
f32 fXEndOff = 1.0f;
f32 fYEndOff = 1.0f;

ColoredVertex newVertices[2] = 
{
    { D3DXVECTOR3((f32)fStartX + fXStartOff, (f32)fStartY + fYStartOff,0), vecColorRGB },
    { D3DXVECTOR3((f32)fEndX + fXEndOff , (f32)fEndY + fYEndOff,0), vecColorRGB }
};

If you know a better solution, please let me know.

like image 171
sandicz Avatar answered Sep 24 '22 22:09

sandicz