• Advertisement
Sign in to follow this  

How to pass these vertices to Direct3D to avoid back culling?

This topic is 2676 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

If I have a set of vertices which constitute of a pyramid,
Which order should I pass them to dx in order to avoid back culling?
when light casts on them?

They are

10, 10, 10
.. ..
5,0,15---------- 15,0,15
| / \|
5,0,5-------------15,0,5



struct JVERTEX {
FLOAT x, y, z;
// FLOAT rhw;
FLOAT nx, ny, nz;
D3DXCOLOR color;
FLOAT tu, tv; // Texture coordinates
};

// Custom flexible vertex format (FVF) describing the custom vertex structure
#define D3DFVF_JVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1)



void drawPyramid (float x, float y, float z, float height, float width)
{

JVERTEX v[] =
{
{10, 10, 10, -ROOT2D2, ROOT2D2, 0, D3DXCOLOR(255,0,255,255), 0, 0, },
////??

};








Thanks in advance



Jack

[Edited by - lucky6969b on October 21, 2010 6:51:18 AM]

Share this post


Link to post
Share on other sites
Advertisement
D3D will cull triangles with vertices specified in counter-clockwise order by default. In D3D9, you can change that with SetRenderState(D3DRS_CULLMODE, mode).

Share this post


Link to post
Share on other sites
Quote:
Original post by Evil Steve
D3D will cull triangles with vertices specified in counter-clockwise order by default. In D3D9, you can change that with SetRenderState(D3DRS_CULLMODE, mode).


Hello Steve,
Thanks for your prompt response,
So will this just barely work?



JVERTEX v[] =
{
{10, 10, 10, -ROOT2D2, ROOT2D2, 0, D3DXCOLOR(255,0,255,255), 0, 0, },
{5,10,15, ... normal2
{5,0,5, ...normal3
{15,0,15 ... normal4
{15,0,5 ... normal5
};


r = g_pDevice->CreateVertexBuffer(sizeof(JVERTEX)*5,0, D3DFVF_JVERTEX, D3DPOOL_DEFAULT, &g_pVB);










cos I am not sure which way is counter-clockwise
Thanks
Jack

[Edited by - lucky6969b on October 21, 2010 7:51:26 AM]

Share this post


Link to post
Share on other sites
Assuming this is a 3D pyramid with no base, you want:


// Front:
(10, 10, 10)
(15,0,5)
(5,0,5)

// Right:
(10, 10, 10)
(15,0,15)
(15,0,5)

// Left
(10, 10, 10)
(5,0,5)
(5,0,15)

// Back:
(10, 10, 10)
(5,0,15)
(15,0,15)


Share this post


Link to post
Share on other sites
Quote:
Original post by Evil Steve
Assuming this is a 3D pyramid with no base, you want:

*** Source Snippet Removed ***


Thanks Steve.
Let me think about it.
Really appreciated...
But should I create 5 seperate vertex buffers for each face.
That seems to be easier.
Jack

Share this post


Link to post
Share on other sites
The winding of a triangle determines the direction of the cross product, which lets the API decide whether or not to cull the triangle.

Picture a Clock, the direction the clock is facing is the direction of it's normal. If the vertices are listed in clockwise order, than this triangle will be drawn by default. A Triangle with vertices at <noon, 4, 8> will be drawn, while a Triangle with vertices reversed <noon, 8, 4> will not.

Share this post


Link to post
Share on other sites
Quote:
Original post by lucky6969b
But should I create 5 seperate vertex buffers for each face.
That seems to be easier.
The easiest and best way would be to use an index buffer.

Then your vertices would be:
{(10, 10, 10), (5, 0, 5), (15, 0, 5), (5, 0, 15), (15, 0, 15)}

And your indices would be:
{
0, 2, 1, // Front
0, 4, 2, // Right
0, 1, 3, // Left
0, 3, 4, // Back
}

Then you can render with a single call to:
DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 5, 0, 4);

Share this post


Link to post
Share on other sites
Hi Evil Steve,
Here I am again. Sorry, after looking into how the vertices are setup,
I don't understand why 0,2,1 isn't clockwise but anti-clockwise

10 10 10
5,0,15
5,0,5


The order should be 10,10,10 => 5,0,5 => 5,0,15
How come?
Thanks
Jack

Share this post


Link to post
Share on other sites
Quote:
Original post by lucky6969b
Hi Evil Steve,
Here I am again. Sorry, after looking into how the vertices are setup,
I don't understand why 0,2,1 isn't clockwise but anti-clockwise

10 10 10
5,0,15
5,0,5


The order should be 10,10,10 => 5,0,5 => 5,0,15
How come?
Thanks
Jack


Winding is relative and coordinate systems are arbitrary. If your camera origin is (0,0,-50) and the look vector is (0,0,1), then in a left handed cordinate system those vertices appear counterclockwise. The coordinate system being left handed due to DirectX programmers typically using D3DXPerspectiveFovLH to set their projection matrix.

Share this post


Link to post
Share on other sites
Sorry, I still can't visualize and convince myself that those vertices are anti-clockwise, no matter how I imagine. Maybe I need some reading materials, any links would be greatly appreciated.
Thanks
Jack

Share this post


Link to post
Share on other sites
Quote:
Original post by lucky6969b
Sorry, I still can't visualize and convince myself that those vertices are anti-clockwise, no matter how I imagine. Maybe I need some reading materials, any links would be greatly appreciated.
Thanks
Jack


If the camera is at (0, 0, -50), looking at (0, 0, 0), the vertices look like:

10,10,10 (0)
___+___
--- ---
+--------------+
5,0,5 (1) 5,0,15 (2)
So the order 0, 2, 1 is a clockwise order - which is what you want, because anti-clockwise triangles are back-facing and culled (by default).

Share this post


Link to post
Share on other sites
Quote:
Original post by Evil Steve
Quote:
Original post by lucky6969b
Sorry, I still can't visualize and convince myself that those vertices are anti-clockwise, no matter how I imagine. Maybe I need some reading materials, any links would be greatly appreciated.
Thanks
Jack


If the camera is at (0, 0, -50), looking at (0, 0, 0), the vertices look like:

10,10,10 (0)
___+___
--- ---
+--------------+
5,0,5 (1) 5,0,15 (2)
So the order 0, 2, 1 is a clockwise order - which is what you want, because anti-clockwise triangles are back-facing and culled (by default).


Oh, I was thinking clockwise triangles get culled. Okay, I get it now.
Thanks, its really great help!
Jack

Share this post


Link to post
Share on other sites
Quote:
Original post by Evil SteveIn D3D9, you can change that with SetRenderState(D3DRS_CULLMODE, mode).


The same possibility exists with DirectX 10 too.

typedef struct D3D10_RASTERIZER_DESC {
D3D10_FILL_MODE FillMode;
D3D10_CULL_MODE CullMode;
BOOL FrontCounterClockwise;
INT DepthBias;
FLOAT DepthBiasClamp;
FLOAT SlopeScaledDepthBias;
BOOL DepthClipEnable;
BOOL ScissorEnable;
BOOL MultisampleEnable;
BOOL AntialiasedLineEnable;
} D3D10_RASTERIZER_DESC;

HRESULT ID3D10Device::CreateRasterizerState(
const D3D10_RASTERIZER_DESC *pRasterizerDesc,
ID3D10RasterizerState **ppRasterizerState);


Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement