Jump to content
  • Advertisement
Sign in to follow this  
oreste

displaying a triangle to the screen

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

DirectX 9 October 2006 (downloaded w/o problems)
Visual Studio 2005 (C++) Standard Edition
OS: Windows 7

From my tutorial: the code below compiles w/o errors & displays to the screen a triangle on a blue background.]

PROBLEM: displays a BLACK trianlge instead of a triangle w/ a different color
emanating from each angle.
It's been a week and I can't find the problem.

Here is the code:

//include the basic Windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>

//define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

//include the Diect3D Library file
#pragma comment (lib, "d3d9.lib")

//global declarations
LPDIRECT3D9 d3d; //the pointer to Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; //the pointer to the device classe
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL; //the pointer to the buffer

//function prototypes
void initD3D(HWND hWnd); //sets up and initializes Direct3D
void render_frame(void); //renders a single frame
void cleanD3D(void); //closes Direct3D and releases memory
void init_graphics(void); //3d declarations

struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

//the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);

//the entry point for any Windows program

int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//the handle for the windows, filled by a function
HWND hWnd;

//this struct holds info for the Windows class
WNDCLASSEX wc;

//clear out the Window class for use
ZeroMemory(&wc, sizeof(WNDCLASSEX));

//fill the struct with the needed info
wc.cbSize = sizeof (WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";

//register the Window class
RegisterClassEx(&wc);

//create the window and use the result as the handle
hWnd = CreateWindowEx (NULL,
L"WindowClass",
L"Our first Direct3D Program",
WS_OVERLAPPEDWINDOW,
0, //x-position
0, //y-position
SCREEN_WIDTH,
SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL);

//display the window on this screen
ShowWindow(hWnd, nCmdShow);

//set up and initialize Direct3D
initD3D(hWnd);

//enter the main loop

//this struct hold Windows event messages
MSG msg;

while(TRUE)
{
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
{
//translate keystroke message into the right format
TranslateMessage(&msg);
//send the message to the WindowProc function
DispatchMessage(&msg);
}
//if the message is WM_QUIT exit the while loop
if(msg.message == WM_QUIT)
break;

render_frame();
}

//clean up DirectX and COM
cleanD3D();

return msg.wParam;

}

//this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
//close the application entirely
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}

//this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION); //create the Direct3D interface

D3DPRESENT_PARAMETERS d3dpp; //create a struct to hold various device info

ZeroMemory(&d3dpp, sizeof(d3dpp)); //clear out the struct for use
d3dpp.Windowed = TRUE; //program windowed not full screen
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //discard old frame
d3dpp.hDeviceWindow = hWnd; //set the window to be used by Direct3D
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; //SET THE BACK BUFFER FORMAT TO 32-BIT
d3dpp.BackBufferWidth = SCREEN_WIDTH; //set the width of the buffer
d3dpp.BackBufferHeight = SCREEN_HEIGHT; //the the heigth of the buffer

//create a device class usinf his info and the info from the d3dpp struct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,

D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);

init_graphics(); //call the function to initialize the triangle
}


//this if the funct used to render a single frame
void render_frame(void)
{
//clear the window to a deep blue
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f,0);

d3ddev->BeginScene(); //begin the 3D scene

//select which vertex format we are using
d3ddev->SetFVF(CUSTOMFVF);

//select the vertex buffer to display
d3ddev->SetStreamSource (0, v_buffer, 0, sizeof(CUSTOMVERTEX));

//copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1);


//do 3D rendering on the back buffer here
d3ddev->EndScene(); //ends the 3D scene

d3ddev->Present(NULL, NULL, NULL, NULL); //displays the created frame on the screen
}

//this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
v_buffer->Release(); //close and release the vertex buffer
d3ddev->Release(); //close and release the 3D device
d3d->Release(); //close and release Direct3D
}


//this is the function that puts the 3D models into video RAM
void init_graphics(void)
{
//create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
{400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB (0, 0, 255), },
{650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB (0, 255, 0), },
{150.0f, 500.0f, 0.5f, D3DCOLOR_XRGB (255, 0, 0), },
};

//create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX),
0, CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);

VOID* pVoid; //a void pointer

//lock v_buffer andload vertices into it
v_buffer->Lock (0, 0, (void**) &pVoid, 0);
memcpy(pVoid, vertices, sizeof(vertices));
v_buffer->Unlock();
}

Share this post


Link to post
Share on other sites
Advertisement
First, some advice: You do absolutely no error checking in your program. That's a very bad habit to get into. Every DirectX function gives some sort of indication of success or failure. Until your program cannot fail, check for errors.

Second: If you're going to post hundreds of lines of code, please use [source][/source] tags. See the faq.

Having said that, you just need to change this line:

{150.0f, 500.0f, 0.5f, D3DCOLOR_XRGB (255, 0, 0), },

to:
{150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB (255, 0, 0), },

You forgot the RHW value.

Share this post


Link to post
Share on other sites
Thank you that solved the prob.

Sorry about the long code. I'm not very familiar with posting etiquette.
I need to correct that.

Thank you again!!

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!