剣の軌跡を表示するために DrawPrimitiveUPを使用して矩形を表示(アルファブレンド使用)するサンプルを作成
していたところ、矩形内に意図しないドットが表示されて困っています。
これといって特別なコードでないため、途方に暮れています。
問題点をご指摘ください。
#include <d3d9.h>
#include <d3dx9.h>
#define SAFE_RELEASE(p) {if(p){(p)->Release();(p)=NULL;}}
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
D3DXVECTOR3 g_vEye(0.0f, 5.0f, -2.0f);
D3DXVECTOR3 g_vAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 g_vUp(0.0f, 1.0f, 0.0f);
float g_Aspect = 64.0f / 48;
struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
// 表示のポリゴン内に意図しないドットが表示される
CUSTOMVERTEX errorVtx[] =
{
{ -1.747887f, 1.501374f, 0.123734f, 0x40FFFFFF},
{ -1.229677f, 2.733887f, 0.803405f, 0x40FFFFFF},
{ -1.741059f, 1.518516f, 0.132266f, 0x40FFFFFF},
{ -1.146863f, 2.726068f, 0.793978f, 0x40FFFFFF},
{ -1.733689f, 1.535205f, 0.140217f, 0x40FFFFFF},
{ -1.066803f, 2.714993f, 0.783149f, 0x40FFFFFF},
{ -1.726145f, 1.551732f, 0.145851f, 0x40FFFFFF},
{ -0.988183f, 2.698073f, 0.770335f, 0x40FFFFFF},
};
// 表示に問題がない
CUSTOMVERTEX normalVtx[] =
{
{ 0.50f, 1.50f, 0.0f, 0x40FFFFFF},
{ 0.50f, 3.00f, 0.0f, 0x40FFFFFF},
{ -0.50f, 1.50f, 0.0f, 0x40FFFFFF},
{ -0.50f, 3.00f, 0.0f, 0x40FFFFFF},
};
HRESULT InitD3D( HWND hWnd )
{
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION))){return E_FAIL;}
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferCount = 1;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.MultiSampleQuality = 0;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.hDeviceWindow = hWnd;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))){
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice))){
return(E_FAIL);
}
}
D3DXMATRIX matWorld, matView, matProj;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixIdentity(&matView);
D3DXMatrixIdentity(&matProj);
D3DXMatrixLookAtLH(&matView, &g_vEye, &g_vAt, &g_vUp);
D3DXMatrixPerspectiveFovLH(&matProj,
D3DX_PI / 3.0f,
g_Aspect,
3.0f,
15.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE );
g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
return S_OK;
}
VOID Cleanup()
{
SAFE_RELEASE(g_pd3dDevice);
SAFE_RELEASE(g_pD3D);
}
VOID Render()
{
if(NULL==g_pd3dDevice) {return;}
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0, 0, 0, 0), 1.0f, 0 );
if(SUCCEEDED(g_pd3dDevice->BeginScene())) {
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 6, &errorVtx[0], sizeof(CUSTOMVERTEX));
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, &normalVtx[0], sizeof(CUSTOMVERTEX));
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg ) {
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
return 0;
case WM_SIZE:
InvalidateRect(hWnd,NULL,true);
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Window1", NULL };
RegisterClassEx( &wc );
RECT rect;
SetRect(&rect,0,0,640,480);
AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
rect.right=rect.right-rect.left;
rect.bottom=rect.bottom-rect.top;
rect.top=0;
rect.left=0;
HWND hWnd = CreateWindow( "Window1", "D3DPT_TRIANGLESTRIP sample",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
rect.right, rect.bottom, NULL, NULL, wc.hInstance, NULL );
if(SUCCEEDED(InitD3D(hWnd))) {
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
while( GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass("Window1",wc.hInstance);
return 0;
}