Jump to content
  • Advertisement
Sign in to follow this  
wabbz111

DirectX10 pyramid creation

This topic is 2430 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

Hi guys iam trying to create a pyramid with direct x 10 but i have not
been successful.I have tried every order of the vertices to no avail.
. Please help out if you can Thanks.

The main file

#include <Windows.h>
#include <d3d10.h>
#include <d3dx10.h>
#include <string>
#pragma comment(lib, "D3D10.lib")
#pragma comment(lib, "d3dx10d.lib")

LPCTSTR WndClassName = L"firstwindow";
HWND hwnd = NULL;

const int Width = 800;
const int Height = 600;

bool InitializeWindow(HINSTANCE hInstance,
int ShowWnd,
int width, int height,
bool windowed);

HRESULT hr;
ID3D10Device* d3dDevice;
IDXGISwapChain* SwapChain;
ID3D10RenderTargetView* RenderTargetView;
ID3D10Effect* FX;
ID3D10InputLayout* VertexLayout;
ID3D10Buffer* VertexBuffer;
ID3D10Buffer* IndexBuffer;
ID3D10EffectTechnique* Technique;
ID3D10DepthStencilView* DepthStencilView;
ID3D10Texture2D* DepthStencilBuffer;
ID3D10EffectMatrixVariable* fxWVPvar;
D3DXMATRIX WVP;
D3DXMATRIX World;
D3DXMATRIX View;
D3DXMATRIX Projection;
D3DXVECTOR3 Position;
D3DXVECTOR3 Target;
D3DXVECTOR3 Up;

////////////////////////////////new///////////////////////////////////////////////////
D3DXMATRIX Rotation;
D3DXMATRIX Scale;
D3DXMATRIX Translation;
D3DXMATRIX Transformations;
float rot = 0.05f;
////////////////////////////////new///////////////////////////////////////////////////

bool InitializeDirect3dApp(HINSTANCE hInstance);
bool InitScene();
void DrawScene();
bool ReleaseObjects();
int messageloop();

LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);


struct Vertex
{
D3DXVECTOR3 pos;
D3DXCOLOR color;
};


int WINAPI WinMain(HINSTANCE hInstance, //Main windows function
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{

if(!InitializeWindow(hInstance, nShowCmd, Width, Height, true))
{
MessageBox(0, L"Window Initialization - Failed",
L"Error", MB_OK);
return 0;
}

if(!InitializeDirect3dApp(hInstance))
{
MessageBox(0, L"Direct3D Initialization - Failed",
L"Error", MB_OK);
return 0;
}

if(!InitScene())
{
MessageBox(0, L"Scene Initialization - Failed",
L"Error", MB_OK);
return 0;
}

messageloop();

if(!ReleaseObjects())
{
MessageBox(0, L"Object Releasing - Failed",
L"Error", MB_OK);
return 0;
}

return 0;
}

bool InitializeWindow(HINSTANCE hInstance,
int ShowWnd,
int width, int height,
bool windowed)
{
typedef struct _WNDCLASS {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;

WNDCLASSEX wc;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2);
wc.lpszMenuName = NULL;
wc.lpszClassName = WndClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Error registering class",
L"Error", MB_OK | MB_ICONERROR);
return 1;
}

hwnd = CreateWindowEx(
NULL,
WndClassName,
L"Window Title",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
width, height,
NULL,
NULL,
hInstance,
NULL
);

if (!hwnd)
{
MessageBox(NULL, L"Error creating window",
L"Error", MB_OK | MB_ICONERROR);
return 1;
}

ShowWindow(hwnd, ShowWnd);
UpdateWindow(hwnd);

return true;
}

bool InitializeDirect3dApp(HINSTANCE hInstance)
{
UINT createDeviceFlags = 0;

D3D10_DRIVER_TYPE driverTypes[] =
{
D3D10_DRIVER_TYPE_HARDWARE,
D3D10_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = sizeof( driverTypes ) / sizeof( driverTypes[0] );

DXGI_SWAP_CHAIN_DESC scd;
scd.BufferDesc.Width = Width;
scd.BufferDesc.Height = Height;
scd.BufferDesc.RefreshRate.Numerator = 60;
scd.BufferDesc.RefreshRate.Denominator = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

//no multisampling
scd.SampleDesc.Count = 1;
scd.SampleDesc.Quality = 0;

scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.BufferCount = 1;
scd.OutputWindow = hwnd;
scd.Windowed = true;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
scd.Flags = 0;

D3D10CreateDeviceAndSwapChain(0, D3D10_DRIVER_TYPE_HARDWARE, 0, 0, D3D10_SDK_VERSION, &scd, &SwapChain, &d3dDevice);

ID3D10Texture2D* backBuffer;
SwapChain->GetBuffer(0, _uuidof(ID3D10Texture2D), reinterpret_cast<void**>(&backBuffer));
d3dDevice->CreateRenderTargetView(backBuffer, 0, &RenderTargetView);
backBuffer->Release();

D3D10_TEXTURE2D_DESC depthStencilDesc;

depthStencilDesc.Width = Width;
depthStencilDesc.Height = Height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilDesc.SampleDesc.Count = 1;
depthStencilDesc.SampleDesc.Quality = 0;
depthStencilDesc.Usage = D3D10_USAGE_DEFAULT;
depthStencilDesc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
depthStencilDesc.CPUAccessFlags = 0;
depthStencilDesc.MiscFlags = 0;

d3dDevice->CreateTexture2D(&depthStencilDesc, NULL, &DepthStencilBuffer);
d3dDevice->CreateDepthStencilView(DepthStencilBuffer, NULL, &DepthStencilView);

d3dDevice->OMSetRenderTargets(1, &RenderTargetView, DepthStencilView);

// Setup the viewport
D3D10_VIEWPORT vp;
vp.Width = Width;
vp.Height = Height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
d3dDevice->RSSetViewports( 1, &vp );

D3DXMatrixIdentity( &World );

////////////////////new//////////////////////////////////////////////////////////////////////
Position = D3DXVECTOR3( 10.0f, 10.0f, 5.0f );
////////////////////new//////////////////////////////////////////////////////////////////////
Target = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
Up = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXMatrixLookAtLH( &View, &Position, &Target, &Up );

return true;
}

bool InitScene()
{

///////////////new//////////////////////////////////////////////////////////////////
Vertex vertices[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
};

////////////////////new//////////////////////////////////////////////////////////////////////

D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_IMMUTABLE;
////////////////////new//////////////////////////////////////////////////////////////////////
bd.ByteWidth = sizeof( Vertex ) * 5;
////////////////////new//////////////////////////////////////////////////////////////////////
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = vertices;
d3dDevice->CreateBuffer( &bd, &InitData, &VertexBuffer );

////////////////////new//////////////////////////////////////////////////////////////////////

//mpya

////////////////////new//////////////////////////////////////////////////////////////////////
DWORD indices[] = {
// front face
0, 2, 1,

// back face
0, 4, 2,

// left face
//0, 1, 4,

// right face
//0, 4, 2,

// top face
//0, 4, 3,
//1, 6, 2,

// bottom face
//4, 2, 1,
//3, 4, 1
};
////////////////////new//////////////////////////////////////////////////////////////////////
//mpya

////////////////////new//////////////////////////////////////////////////////////////////////

D3D10_BUFFER_DESC ibd;
ibd.Usage = D3D10_USAGE_IMMUTABLE;
////////////////////new//////////////////////////////////////////////////////////////////////
ibd.ByteWidth = sizeof(DWORD) * 7 * 3;
////////////////////new//////////////////////////////////////////////////////////////////////
ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
d3dDevice->CreateBuffer(&ibd, &iinitData, &IndexBuffer);

UINT stride = sizeof( Vertex );
UINT offset = 0;
d3dDevice->IASetVertexBuffers( 0, 1, &VertexBuffer, &stride, &offset );
d3dDevice->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);

D3D10_INPUT_ELEMENT_DESC layout[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0}
};

ID3D10Blob* compilationErrors = 0;
HRESULT hr = 0;
hr = D3DX10CreateEffectFromFile( L"vertex.fx", NULL, NULL, "fx_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
d3dDevice, NULL, NULL, &FX, &compilationErrors, NULL );
if(FAILED(hr))
{
MessageBoxA(0, (char*)compilationErrors->GetBufferPointer(), 0, 0);
compilationErrors->Release();
return false;
}

Technique = FX->GetTechniqueByName( "Tech" );

fxWVPvar = FX->GetVariableByName("WVP")->AsMatrix();

D3D10_PASS_DESC PassDesc;
Technique->GetPassByIndex( 0 )->GetDesc( &PassDesc );
d3dDevice->CreateInputLayout( layout, 2, PassDesc.pIAInputSignature,
PassDesc.IAInputSignatureSize, &VertexLayout );

d3dDevice->IASetInputLayout( VertexLayout );

d3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
return true;
}

bool ReleaseObjects()
{
if( d3dDevice ) d3dDevice->ClearState();

if( VertexBuffer ) VertexBuffer->Release();
if( IndexBuffer ) IndexBuffer->Release();
if( VertexLayout ) VertexLayout->Release();
if( FX ) FX->Release();
if( RenderTargetView ) RenderTargetView->Release();
if( SwapChain ) SwapChain->Release();
if( d3dDevice ) d3dDevice->Release();

return true;
}

void DrawScene()
{
//Draw Scene Here
D3DXCOLOR bgColor( 0.0f, 0.0f, 0.0f, 1.0f);
d3dDevice->ClearRenderTargetView( RenderTargetView, bgColor );
d3dDevice->ClearDepthStencilView(DepthStencilView, D3D10_CLEAR_DEPTH|D3D10_CLEAR_STENCIL, 1.0f, 0);

D3DXMatrixPerspectiveFovLH(&Projection, 0.4f*3.14f, Width/Height, 1.0f, 1000.0f);

////////////////////new//////////////////////////////////////////////////////////////////////
D3DXVECTOR3 rotaxis(0.0f, 1.0f, 0.0f);

D3DXMatrixRotationAxis(&Rotation, &rotaxis, rot);
D3DXMatrixTranslation( &Translation, 0.0f, 0.0f, 4.0f );
Transformations =Translation * Rotation;

rot += .0005f;

WVP = World * Transformations * View * Projection;
////////////////////new//////////////////////////////////////////////////////////////////////
fxWVPvar->SetMatrix((float*)&WVP);

D3D10_TECHNIQUE_DESC techDesc;
Technique->GetDesc( &techDesc );

/*draw first cube
for( UINT p = 0; p < techDesc.Passes; ++p )
{
Technique->GetPassByIndex( p )->Apply( 0 );
d3dDevice->DrawIndexed(36, 0, 0);
}*/

////////////////////new//////////////////////////////////////////////////////////////////////
D3DXMatrixRotationAxis(&Rotation, &rotaxis, -rot);
D3DXMatrixScaling( &Scale, 1.3f, 1.3f, 1.3f );

Transformations = Rotation * Scale;

WVP = World * Transformations * View * Projection;
fxWVPvar->SetMatrix((float*)&WVP);
//draw second cube
for( UINT p = 0; p < techDesc.Passes; ++p )
{
Technique->GetPassByIndex( p )->Apply( 0 );
d3dDevice->DrawIndexed(21, 0, 0);
}
////////////////////new//////////////////////////////////////////////////////////////////////

SwapChain->Present( 0, 0 );
///////////////new//////////////////////////////////////////////////////////////////
}

int messageloop(){
MSG msg;
ZeroMemory(&msg, sizeof(MSG));
while(true)
{
BOOL PeekMessageL(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
// run game code
DrawScene();
}
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch( msg )
{
case WM_KEYDOWN:
if( wParam == VK_ESCAPE ){
if(MessageBox(0, L"Are you sure you want to exit?",
L"Really?", MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
}
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,
msg,
wParam,
lParam);
}





The vertex file
//"vertex.fx" file

cbuffer cbPerObject
{
float4x4 WVP;
};

struct VS_OUTPUT //output structure for vertex shader
{
float4 Pos : SV_POSITION;
float4 Color : COLOR0;
};

// Vertex Shader
VS_OUTPUT VS(float4 inPos : POSITION, float4 inColor : COLOR)
{
VS_OUTPUT output = (VS_OUTPUT)0;

output.Pos = mul(inPos, WVP);

output.Color = inColor;

return output; //send color and position to pixel shader
}

// Pixel Shader
float4 PS(VS_OUTPUT input) : SV_Target
{
return input.Color; // Set the color of the pixel to what we defined for the vertex.
}

technique10 Tech
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS() ) );
SetPixelShader( CompileShader( ps_4_0, PS() ) );
}
}






Share this post


Link to post
Share on other sites
Advertisement
When you create Input Layout you specify Position as 12 byte data ([font=CourierNew, monospace][size=2]DXGI_FORMAT_R32G32B32_FLOAT)[/font], however your shader requires 16 byte data (float4). That might cause some issues.

Share this post


Link to post
Share on other sites
please be more specific about the problem next time. are you getting an error? or is the pyramid not showing up? or is it you need help with the actual math of creating a pyramid?

anyway, just skimming through your code, i see you are trying to draw geometry using 21 indices:

d3dDevice->DrawIndexed(21, 0, 0);

when you are defining only 6 (first two triangles):
DWORD indices[] = {
// front face
0, 2, 1,

// back face
0, 4, 2,

// left face
//0, 1, 4,

// right face
//0, 4, 2,

// top face
//0, 4, 3,
//1, 6, 2,

// bottom face
//4, 2, 1,
//3, 4, 1
};


You are also making room for 21 indices even though you only have six uncommented above:

ibd.ByteWidth = sizeof(DWORD) * 7 * 3;

But, your problem actually doesn't have anything to do with the indices at all. You are only defining a position for your vertices. If you want your geometry to show up, you have to give it some kind of color. try returning a solid color from your pixel shader, like this:

return float4(1.0f, 1.0f, 1.0f, 1.0f);

after you test that out, add some color to your vertices ;)

also if you look at it, whats happening when you create your vertices, is that only every other vertex is used as a position, so your geometry will be a little messed up too: (in your index buffer, when using the "4"th vertex in the second face, it is undefined and will be some strange number, since it wasn't actually defined in the vertex list)

Vertex vertices[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ), // Position
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), // Color
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), // Position
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), // Color
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), // Position
};


change it to this, (where the second d3dxvector3 on each line is the color):


Vertex vertices[] =
{
{D3DXVECTOR3( 0.0f, 0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )} // Position, Color
};

Share this post


Link to post
Share on other sites

please be more specific about the problem next time. are you getting an error? or is the pyramid not showing up? or is it you need help with the actual math of creating a pyramid?

anyway, just skimming through your code, i see you are trying to draw geometry using 21 indices:

d3dDevice->DrawIndexed(21, 0, 0);

when you are defining only 6 (first two triangles):
DWORD indices[] = {
// front face
0, 2, 1,

// back face
0, 4, 2,

// left face
//0, 1, 4,

// right face
//0, 4, 2,

// top face
//0, 4, 3,
//1, 6, 2,

// bottom face
//4, 2, 1,
//3, 4, 1
};


You are also making room for 21 indices even though you only have six uncommented above:

ibd.ByteWidth = sizeof(DWORD) * 7 * 3;

But, your problem actually doesn't have anything to do with the indices at all. You are only defining a position for your vertices. If you want your geometry to show up, you have to give it some kind of color. try returning a solid color from your pixel shader, like this:

return float4(1.0f, 1.0f, 1.0f, 1.0f);

after you test that out, add some color to your vertices ;)

also if you look at it, whats happening when you create your vertices, is that only every other vertex is used as a position, so your geometry will be a little messed up too: (in your index buffer, when using the "4"th vertex in the second face, it is undefined and will be some strange number, since it wasn't actually defined in the vertex list)

Vertex vertices[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ), // Position
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), // Color
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), // Position
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), // Color
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), // Position
};


change it to this, (where the second d3dxvector3 on each line is the color):


Vertex vertices[] =
{
{D3DXVECTOR3( 0.0f, 0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )} // Position, Color
};



Thank you for the replies. iedoc i made the changes you advised but i only get the front face being drawn
(which was what i was getting before) i'm not sure if the other face is also being drawn since my view angle
does not show the sides. could the camera angle be the problem?
I will keep trying but if you have any more tips i will be very appreciative.

Share this post


Link to post
Share on other sites
not to say your wrong, but i don't think its culling because the second triangle uses the same vertex positions as the first, but is just drawn backwards. I copied and pasted all your code and only changed the vertex list to include color for each vertex (don't forget the extra pair of brackets around each vertex "{..}"), and it worked perfectly fine for me, i'll just paste the code, which is your exact code but the small changes of the vertex list:

#include <Windows.h>
#include <d3d10.h>
#include <d3dx10.h>
#include <string>
#pragma comment(lib, "D3D10.lib")
#pragma comment(lib, "d3dx10d.lib")

LPCTSTR WndClassName = L"firstwindow";
HWND hwnd = NULL;

const int Width = 800;
const int Height = 600;

bool InitializeWindow(HINSTANCE hInstance,
int ShowWnd,
int width, int height,
bool windowed);

HRESULT hr;
ID3D10Device* d3dDevice;
IDXGISwapChain* SwapChain;
ID3D10RenderTargetView* RenderTargetView;
ID3D10Effect* FX;
ID3D10InputLayout* VertexLayout;
ID3D10Buffer* VertexBuffer;
ID3D10Buffer* IndexBuffer;
ID3D10EffectTechnique* Technique;
ID3D10DepthStencilView* DepthStencilView;
ID3D10Texture2D* DepthStencilBuffer;
ID3D10EffectMatrixVariable* fxWVPvar;
D3DXMATRIX WVP;
D3DXMATRIX World;
D3DXMATRIX View;
D3DXMATRIX Projection;
D3DXVECTOR3 Position;
D3DXVECTOR3 Target;
D3DXVECTOR3 Up;

////////////////////////////////new///////////////////////////////////////////////////
D3DXMATRIX Rotation;
D3DXMATRIX Scale;
D3DXMATRIX Translation;
D3DXMATRIX Transformations;
float rot = 0.05f;
////////////////////////////////new///////////////////////////////////////////////////

bool InitializeDirect3dApp(HINSTANCE hInstance);
bool InitScene();
void DrawScene();
bool ReleaseObjects();
int messageloop();

LRESULT CALLBACK WndProc(HWND hWnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);


struct Vertex
{
D3DXVECTOR3 pos;
D3DXCOLOR color;
};


int WINAPI WinMain(HINSTANCE hInstance, //Main windows function
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd)
{

if(!InitializeWindow(hInstance, nShowCmd, Width, Height, true))
{
MessageBox(0, L"Window Initialization - Failed",
L"Error", MB_OK);
return 0;
}

if(!InitializeDirect3dApp(hInstance))
{
MessageBox(0, L"Direct3D Initialization - Failed",
L"Error", MB_OK);
return 0;
}

if(!InitScene())
{
MessageBox(0, L"Scene Initialization - Failed",
L"Error", MB_OK);
return 0;
}

messageloop();

if(!ReleaseObjects())
{
MessageBox(0, L"Object Releasing - Failed",
L"Error", MB_OK);
return 0;
}

return 0;
}

bool InitializeWindow(HINSTANCE hInstance,
int ShowWnd,
int width, int height,
bool windowed)
{
typedef struct _WNDCLASS {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;

WNDCLASSEX wc;

wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2);
wc.lpszMenuName = NULL;
wc.lpszClassName = WndClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if (!RegisterClassEx(&wc))
{
MessageBox(NULL, L"Error registering class",
L"Error", MB_OK | MB_ICONERROR);
return 1;
}

hwnd = CreateWindowEx(
NULL,
WndClassName,
L"Window Title",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
width, height,
NULL,
NULL,
hInstance,
NULL
);

if (!hwnd)
{
MessageBox(NULL, L"Error creating window",
L"Error", MB_OK | MB_ICONERROR);
return 1;
}

ShowWindow(hwnd, ShowWnd);
UpdateWindow(hwnd);

return true;
}

bool InitializeDirect3dApp(HINSTANCE hInstance)
{
UINT createDeviceFlags = 0;

D3D10_DRIVER_TYPE driverTypes[] =
{
D3D10_DRIVER_TYPE_HARDWARE,
D3D10_DRIVER_TYPE_REFERENCE,
};
UINT numDriverTypes = sizeof( driverTypes ) / sizeof( driverTypes[0] );

DXGI_SWAP_CHAIN_DESC scd;
scd.BufferDesc.Width = Width;
scd.BufferDesc.Height = Height;
scd.BufferDesc.RefreshRate.Numerator = 60;
scd.BufferDesc.RefreshRate.Denominator = 1;
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
scd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

//no multisampling
scd.SampleDesc.Count = 1;
scd.SampleDesc.Quality = 0;

scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scd.BufferCount = 1;
scd.OutputWindow = hwnd;
scd.Windowed = true;
scd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
scd.Flags = 0;

D3D10CreateDeviceAndSwapChain(0, D3D10_DRIVER_TYPE_HARDWARE, 0, 0, D3D10_SDK_VERSION, &scd, &SwapChain, &d3dDevice);

ID3D10Texture2D* backBuffer;
SwapChain->GetBuffer(0, _uuidof(ID3D10Texture2D), reinterpret_cast<void**>(&backBuffer));
d3dDevice->CreateRenderTargetView(backBuffer, 0, &RenderTargetView);
backBuffer->Release();

D3D10_TEXTURE2D_DESC depthStencilDesc;

depthStencilDesc.Width = Width;
depthStencilDesc.Height = Height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilDesc.SampleDesc.Count = 1;
depthStencilDesc.SampleDesc.Quality = 0;
depthStencilDesc.Usage = D3D10_USAGE_DEFAULT;
depthStencilDesc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
depthStencilDesc.CPUAccessFlags = 0;
depthStencilDesc.MiscFlags = 0;

d3dDevice->CreateTexture2D(&depthStencilDesc, NULL, &DepthStencilBuffer);
d3dDevice->CreateDepthStencilView(DepthStencilBuffer, NULL, &DepthStencilView);

d3dDevice->OMSetRenderTargets(1, &RenderTargetView, DepthStencilView);

// Setup the viewport
D3D10_VIEWPORT vp;
vp.Width = Width;
vp.Height = Height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
d3dDevice->RSSetViewports( 1, &vp );

D3DXMatrixIdentity( &World );

////////////////////new//////////////////////////////////////////////////////////////////////
Position = D3DXVECTOR3( 10.0f, 10.0f, 5.0f );
////////////////////new//////////////////////////////////////////////////////////////////////
Target = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
Up = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
D3DXMatrixLookAtLH( &View, &Position, &Target, &Up );

return true;
}

bool InitScene()
{

///////////////new//////////////////////////////////////////////////////////////////
Vertex vertices[] =
{
{D3DXVECTOR3( 0.0f, 0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )} // Position, Color
};

////////////////////new//////////////////////////////////////////////////////////////////////

D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_IMMUTABLE;
////////////////////new//////////////////////////////////////////////////////////////////////
bd.ByteWidth = sizeof( Vertex ) * 5;
////////////////////new//////////////////////////////////////////////////////////////////////
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = vertices;
d3dDevice->CreateBuffer( &bd, &InitData, &VertexBuffer );

////////////////////new//////////////////////////////////////////////////////////////////////

//mpya

////////////////////new//////////////////////////////////////////////////////////////////////
DWORD indices[] = {
// front face
0, 2, 1,

// back face
0, 4, 2,

// left face
//0, 1, 4,

// right face
//0, 4, 2,

// top face
//0, 4, 3,
//1, 6, 2,

// bottom face
//4, 2, 1,
//3, 4, 1
};
////////////////////new//////////////////////////////////////////////////////////////////////
//mpya

////////////////////new//////////////////////////////////////////////////////////////////////

D3D10_BUFFER_DESC ibd;
ibd.Usage = D3D10_USAGE_IMMUTABLE;
////////////////////new//////////////////////////////////////////////////////////////////////
ibd.ByteWidth = sizeof(DWORD) * 7 * 3;
////////////////////new//////////////////////////////////////////////////////////////////////
ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
d3dDevice->CreateBuffer(&ibd, &iinitData, &IndexBuffer);

UINT stride = sizeof( Vertex );
UINT offset = 0;
d3dDevice->IASetVertexBuffers( 0, 1, &VertexBuffer, &stride, &offset );
d3dDevice->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);

D3D10_INPUT_ELEMENT_DESC layout[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0}
};

ID3D10Blob* compilationErrors = 0;
HRESULT hr = 0;
hr = D3DX10CreateEffectFromFile( L"vertex.fx", NULL, NULL, "fx_4_0", D3D10_SHADER_ENABLE_STRICTNESS, 0,
d3dDevice, NULL, NULL, &FX, &compilationErrors, NULL );
if(FAILED(hr))
{
MessageBoxA(0, (char*)compilationErrors->GetBufferPointer(), 0, 0);
compilationErrors->Release();
return false;
}

Technique = FX->GetTechniqueByName( "Tech" );

fxWVPvar = FX->GetVariableByName("WVP")->AsMatrix();

D3D10_PASS_DESC PassDesc;
Technique->GetPassByIndex( 0 )->GetDesc( &PassDesc );
d3dDevice->CreateInputLayout( layout, 2, PassDesc.pIAInputSignature,
PassDesc.IAInputSignatureSize, &VertexLayout );

d3dDevice->IASetInputLayout( VertexLayout );

d3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
return true;
}

bool ReleaseObjects()
{
if( d3dDevice ) d3dDevice->ClearState();

if( VertexBuffer ) VertexBuffer->Release();
if( IndexBuffer ) IndexBuffer->Release();
if( VertexLayout ) VertexLayout->Release();
if( FX ) FX->Release();
if( RenderTargetView ) RenderTargetView->Release();
if( SwapChain ) SwapChain->Release();
if( d3dDevice ) d3dDevice->Release();

return true;
}

void DrawScene()
{
//Draw Scene Here
D3DXCOLOR bgColor( 0.0f, 0.0f, 0.0f, 1.0f);
d3dDevice->ClearRenderTargetView( RenderTargetView, bgColor );
d3dDevice->ClearDepthStencilView(DepthStencilView, D3D10_CLEAR_DEPTH|D3D10_CLEAR_STENCIL, 1.0f, 0);

D3DXMatrixPerspectiveFovLH(&Projection, 0.4f*3.14f, Width/Height, 1.0f, 1000.0f);

////////////////////new//////////////////////////////////////////////////////////////////////
D3DXVECTOR3 rotaxis(0.0f, 1.0f, 0.0f);

D3DXMatrixRotationAxis(&Rotation, &rotaxis, rot);
D3DXMatrixTranslation( &Translation, 0.0f, 0.0f, 4.0f );
Transformations =Translation * Rotation;

rot += .0005f;

WVP = World * Transformations * View * Projection;
////////////////////new//////////////////////////////////////////////////////////////////////
fxWVPvar->SetMatrix((float*)&WVP);

D3D10_TECHNIQUE_DESC techDesc;
Technique->GetDesc( &techDesc );

/*draw first cube
for( UINT p = 0; p < techDesc.Passes; ++p )
{
Technique->GetPassByIndex( p )->Apply( 0 );
d3dDevice->DrawIndexed(36, 0, 0);
}*/

////////////////////new//////////////////////////////////////////////////////////////////////
D3DXMatrixRotationAxis(&Rotation, &rotaxis, -rot);
D3DXMatrixScaling( &Scale, 1.3f, 1.3f, 1.3f );

Transformations = Rotation * Scale;

WVP = World * Transformations * View * Projection;
fxWVPvar->SetMatrix((float*)&WVP);
//draw second cube
for( UINT p = 0; p < techDesc.Passes; ++p )
{
Technique->GetPassByIndex( p )->Apply( 0 );
d3dDevice->DrawIndexed(21, 0, 0);
}
////////////////////new//////////////////////////////////////////////////////////////////////

SwapChain->Present( 0, 0 );
///////////////new//////////////////////////////////////////////////////////////////
}

int messageloop(){
MSG msg;
ZeroMemory(&msg, sizeof(MSG));
while(true)
{
BOOL PeekMessageL(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);

if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
// run game code
DrawScene();
}
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam)
{
switch( msg )
{
case WM_KEYDOWN:
if( wParam == VK_ESCAPE ){
if(MessageBox(0, L"Are you sure you want to exit?",
L"Really?", MB_YESNO | MB_ICONQUESTION) == IDYES)
DestroyWindow(hwnd);
}
return 0;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,
msg,
wParam,
lParam);
}


I didn't touch the vertex file and it works

and i wouldn't forget to change those other parts that i mentioned about your index list, where you say to use 21 indices (when creating the index buffer and drawing the geometry)

Share this post


Link to post
Share on other sites

not to say your wrong, but i don't think its culling

You’re right, it wasn’t the culling.


I copied and pasted all your code and only changed the vertex list to include color for each vertex (don't forget the extra pair of brackets around each vertex "{..}"), and it worked perfectly fine for me, i'll just paste the code, which is your exact code but the small changes of the vertex list
[...]
and i wouldn't forget to change those other parts that i mentioned about your index list, where you say to use 21 indices (when creating the index buffer and drawing the geometry)

When I copied your code into a project, it wasn’t a pyramid that showed up in front of me. I uncommented the other faces, but I’ve only seen 2 faces. Short glance with PIX on it showed, that the vertex buffer has duplicate vertices, thus triangles degenerated to lines.
I changed the vertex buffer to:
Vertex vertices[] =
{
{D3DXVECTOR3( 0.0f, 0.5f, 0.0f ), D3DXVECTOR4( 0.0f, 0.5f, 0.5f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 1.0f, 0.0f, 0.0f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f, 0.5f ), D3DXVECTOR4( 0.0f, 1.0f, 0.0f, 0.0f )}, // Position, Color
{D3DXVECTOR3( 0.5f, -0.5f,-0.5f ), D3DXVECTOR4( 0.0f, 0.0f, 1.0f, 0.0f )}, // Position, Color
{D3DXVECTOR3( -0.5f, -0.5f,-0.5f ), D3DXVECTOR4( 1.0f, 1.0f, 0.0f, 0.0f )} // Position, Color
};


And the index buffer to:
DWORD indices[] = {
// front face
0, 2, 1,

// back face
0, 3, 4,

// left face
0, 1, 3,

// right face
0, 4, 2,

/* // top face -> why was here a top face?
0, 4, 3,
1, 6, 2,
*/
// bottom face
4, 1, 2,
3, 1, 4
};

Now I see a very colorful pyramid. :)
By the way, we only need 18 indices here.

Share this post


Link to post
Share on other sites
I didn't realize all the indices were actually for an entire pyramid ( most of the code looks cut and paste so i thought the commented indices were part of a cube, haha), i just thought he was calling that triangle a pyramid, haha, but I did noticed the duplicate vertices, just didn't mention it. i'm pretty sure your post is exactly what he was looking for though

also wabz, if you do want to display both sides of some geometry, you should do what tsus said above and turn off backface culling instead of drawing the exact same geometry twice.

Share this post


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

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!