Gaps/Holes/Pixelation when rendering triangles

Started by
3 comments, last by skrug80sc 11 years, 4 months ago
I'm trying to learn how to render triangles with the DrawIndexedPrimitive function in DirectX9c.
I currently have triangles rendering but they don't seem to be rendering just quite right.
Here is a picture to show you what I mean:
tri_wire.png
See the pexelation? What am I doing wrong?
I've attached the relative files from my project to allow further investigation:

Here is the main code:

WinMain.cpp

#include "WINlib.h"
#include "GFXlib.h"
int WINAPI WinMain(HINSTANCE cI, HINSTANCE pI, LPSTR cmd, int shw)
{
//instantiate window/directX9
WINPUT::Window window;
GFX::Graphics graphics(window.GetHandle());

//Index/Vertex data
typedef WORD Index;
struct Vertex { D3DXVECTOR3 pos; D3DCOLOR color; };
D3DVERTEXELEMENT9 declaration[3] = {
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
D3DDECL_END()
};

//Bulid triangle
Vertex vertices[] = {
{ D3DXVECTOR3(0, 0, 0), D3DCOLOR_XRGB(255, 0, 0) },
{ D3DXVECTOR3(0, 1, 0), D3DCOLOR_XRGB(0, 255, 0) },
{ D3DXVECTOR3(1, 0, 0), D3DCOLOR_XRGB(0, 0, 255) }
};
Index indices[] = {0, 1, 2};

//Build Vertex Declaration and Index/Vertex buffers
IDirect3DDevice9* dev = graphics.GetDevice();
IDirect3DVertexDeclaration9* dec = NULL;
IDirect3DVertexBuffer9* vb = NULL;
IDirect3DIndexBuffer9* ib = NULL;

dev->CreateVertexDeclaration(declaration, &dec);
dev->CreateVertexBuffer(
sizeof(Vertex) * 3,
D3DUSAGE_WRITEONLY,
0,
D3DPOOL_MANAGED,
&vb,
NULL);
dev->CreateIndexBuffer(
sizeof(Index) * 3,
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_DEFAULT,
&ib,
NULL);

//copy triangle data to Vertex/Index buffers
Vertex* v = NULL;
vb->Lock(0, 0, (void**)&v, 0);
memcpy(v, vertices, sizeof(Vertex) * 3);
vb->Unlock();

Index* i = NULL;
ib->Lock(0, 0, (void**)&i, 0);
memcpy(i, indices, sizeof(Index) * 3);
ib->Unlock();

//set rendering properties
dev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//dev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
dev->SetRenderState(D3DRS_LIGHTING, FALSE);
dev->SetVertexDeclaration(dec);
dev->SetStreamSource(0, vb, 0, sizeof(Vertex));
dev->SetIndices(ib);

//render loop
while(!GetAsyncKeyState(VK_ESCAPE))
{
window.Update();
dev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(32, 32, 32), 1.0f, 0);
dev->BeginScene();
dev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);
dev->EndScene();
dev->Present(0, 0, 0, 0);
}

//cleanup
vb->Release();
ib->Release();
dec->Release();

return 0;
}
Advertisement
Try enabling multi-sampling in your DirectX device creation code. D3DMULTISAMPLE_2_SAMPLES for instance.
Enabling the maximum multi-sampling my video card supports helped a little, but not much.
I've rendered models from .X files in DirextX9 before and using
device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
has never given me this issue before.
That is a strange artefact. My first guess is that you're creating a back-buffer that's larger than your window's client-area.
Thanks Hodgman, that was exactly the issue. I made a ClientResize function for my Window class but copy pasted it from an older code file of mine that was incorrect. The copy pasta did it to me again ><

This topic is closed to new replies.

Advertisement