何故か横に引き伸ばされてしまう
立方体を表示させるつもりなのに
一体何が問題なんだろうか……
[code]
#pragma once
#include "DXGraphics.h"
// DirectX 3Dグラフィックス関連
class CDXGraphics3D;
struct XYZBuffer
{
FLOAT x,y,z;
};
struct ColorBuffer
{
D3DCOLOR color;
};
class CDXGraphics3D
{
public:
class CDXGraphics * m_pDXG;
XYZBuffer * pXYZ;
ColorBuffer * pCol;
DWORD * pIndex;
LPDIRECT3DVERTEXDECLARATION9 pDecl;
LPDIRECT3DVERTEXBUFFER9 pD3DVB_XYZ;
LPDIRECT3DVERTEXBUFFER9 pD3DVB_COLOR;
LPDIRECT3DINDEXBUFFER9 pD3DIB;
LPDIRECT3DVERTEXSHADER9 vertex_shader;
LPDIRECT3DPIXELSHADER9 pixel_shader;
D3DXMATRIX mat;
D3DXMATRIX matWorld;
D3DXMATRIX matScalling;
D3DXVECTOR3 vEye,vAt,vUp;
D3DXMATRIX matView;
D3DXMATRIX matPers;
LPDIRECT3DSTATEBLOCK9 pStateBlock;
CDXGraphics3D(CDXGraphics *pDXG)
{
m_pDXG = pDXG;
//頂点フォーマットの定義
D3DVERTEXELEMENT9 decl[] =
{
{0,0,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0},
{1,0,D3DDECLTYPE_D3DCOLOR,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_COLOR,0},
D3DDECL_END()
};
//頂点宣言オブジェクトを作る
m_pDXG->m_pD3DDevice->CreateVertexDeclaration(
decl,
&pDecl
);
}
void preparing_3D()
{
set_viewport();
create_buffers();
create_shaders();
calculation();
settings_and_register();
}
void set_viewport()
{
HRESULT hr;
D3DVIEWPORT9 vp;
vp.X = 0;
vp.Y = 0;
vp.Width = m_pDXG->m_d3dpp.BackBufferWidth;
vp.Height = m_pDXG->m_d3dpp.BackBufferHeight;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
hr = m_pDXG->m_pD3DDevice->SetViewport(&vp);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
}
void create_buffers()
{
//頂点バッファ、インデックスバッファの作成
//頂点バッファ
HRESULT hr;
int vertex_number = 8;
hr = m_pDXG->m_pD3DDevice->CreateVertexBuffer(sizeof(XYZBuffer) * vertex_number,0,0,D3DPOOL_MANAGED,&pD3DVB_XYZ,NULL);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
hr = m_pDXG->m_pD3DDevice->CreateVertexBuffer(sizeof(ColorBuffer) * vertex_number,0,0,D3DPOOL_MANAGED,&pD3DVB_COLOR,NULL);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
//インデックスバッファ
//インデックスバッファの考え方
// 立方体メッシュ→6面
// 正方形→三角形プリミティブ2つで構成
// 三角形プリミティブ→3つの頂点
// インデックスバッファ→ 6 * 2 * 3 = 36頂点分必要
hr = m_pDXG->m_pD3DDevice->CreateIndexBuffer(
sizeof(DWORD) * 36,
0,
D3DFMT_INDEX32,
D3DPOOL_MANAGED,
&pD3DIB,
NULL
);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
//頂点バッファへの書き込み
pD3DVB_XYZ->Lock(0,0,(LPVOID *)&pXYZ,0);
// 書き込み
pXYZ[0].x =1.0f;pXYZ[0].y =1.0f; pXYZ[0].z =1.0f;
pXYZ[1].x =1.0f;pXYZ[1].y =1.0f; pXYZ[1].z =-1.0f;
pXYZ[2].x =1.0f;pXYZ[2].y =-1.0f; pXYZ[2].z =1.0f;
pXYZ[3].x =1.0f;pXYZ[3].y =-1.0f; pXYZ[3].z =-1.0f;
pXYZ[4].x =-1.0f;pXYZ[4].y =1.0f; pXYZ[4].z =1.0f;
pXYZ[5].x =-1.0f;pXYZ[5].y =1.0f; pXYZ[5].z =-1.0f;
pXYZ[6].x =-1.0f;pXYZ[6].y =-1.0f;pXYZ[6].z =1.0f;
pXYZ[7].x =-1.0f;pXYZ[7].y =-1.0f;pXYZ[7].z =-1.0f;
pD3DVB_XYZ->Unlock();
pD3DVB_COLOR->Lock(0,0,(LPVOID *)&pCol,0);
// 書き込み
pCol[0].color=D3DCOLOR_XRGB(0x00,0xff,0x00);
pCol[1].color=D3DCOLOR_XRGB(0x00,0x00,0x00);
pCol[2].color=D3DCOLOR_XRGB(0x00,0x00,0x00);
pCol[3].color=D3DCOLOR_XRGB(0xff,0x00,0x00);
pCol[4].color=D3DCOLOR_XRGB(0x00,0x00,0xff);
pCol[5].color=D3DCOLOR_XRGB(0x00,0x00,0x00);
pCol[6].color=D3DCOLOR_XRGB(0x00,0xff,0x00);
pCol[7].color=D3DCOLOR_XRGB(0x00,0x00,0x00);
pD3DVB_COLOR->Unlock();
//インデックスバッファへの書き込み
pD3DIB->Lock(0,0,(LPVOID *)&pIndex,0);
//書き込み
pIndex[0]=0; pIndex[1]=3; pIndex[2]=1;
pIndex[3]=0; pIndex[4]=2; pIndex[5]=3;
pIndex[6]=0; pIndex[7]=5; pIndex[8]=4;
pIndex[9]=0; pIndex[10]=1; pIndex[11]=5;
pIndex[12]=4; pIndex[13]=2; pIndex[14]=0;
pIndex[15]=4; pIndex[16]=6; pIndex[17]=2;
pIndex[18]=5; pIndex[19]=6; pIndex[20]=4;
pIndex[21]=5; pIndex[22]=7; pIndex[23]=6;
pIndex[24]=3; pIndex[25]=6; pIndex[26]=7;
pIndex[27]=3; pIndex[28]=2; pIndex[29]=6;
pIndex[30]=1; pIndex[31]=7; pIndex[32]=5;
pIndex[33]=1; pIndex[34]=3; pIndex[35]=7;
pD3DIB->Unlock();
}
void create_shaders()
{
HRESULT hr;
//プログラマブルシェーダの作成
LPD3DXBUFFER pCode;
hr = D3DXAssembleShaderFromFileW(
L"dat\\vertex_shader.txt",
NULL,NULL,0,
&pCode,
NULL
);
if(FAILED(hr))
{
MessageBoxW(NULL,L"頂点シェーダのコンパイルに失敗",L"ERR",MB_OK);
}
hr = m_pDXG->m_pD3DDevice->CreateVertexShader((DWORD *)pCode->GetBufferPointer(),&vertex_shader);
DX_RELEASE(pCode);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
hr = D3DXAssembleShaderFromFileW(
L"dat\\pixel_shader.txt",
NULL,NULL,0,
&pCode,
NULL
);
if(FAILED(hr))
{
MessageBoxW(NULL,L"ピクセルシェーダのコンパイルに失敗",L"ERR",MB_OK);
}
hr = m_pDXG->m_pD3DDevice->CreatePixelShader((DWORD *)pCode->GetBufferPointer(),&pixel_shader);
DX_RELEASE(pCode);
if(FAILED(hr))
{
MessageBoxW(NULL,L"",L"ERR",MB_OK);
}
}
void calculation()
{
//行列の計算
// ワールド
D3DXMatrixRotationX(&matWorld , 1.0f);
D3DXMatrixScaling(
&matScalling,
1.0f,
1.0f,
1.0f
);
vEye.x = 0.0f;
vEye.y = 5.0f;
vEye.z = -5.0f;
vAt.x = 0.0f;
vAt.y = 0.0f;
vAt.z = 0.0f;
vUp.x = 0.0f;
vUp.y = 1.0f;
vUp.z = 0.0f;
// ビュー
D3DXMatrixLookAtLH(
&matView,
&vEye,
&vAt,
&vUp
);
// 透視(パース)
D3DXMatrixPerspectiveFovLH(
&matPers,
3.1415f / 3.0f,
m_pDXG->m_d3dpp.BackBufferWidth / m_pDXG->m_d3dpp.BackBufferHeight,
3.0f,
12.0f
);
//掛け合わせ
mat = matScalling * matWorld * matView * matPers;
//転置行列に変換
D3DXMatrixTranspose(&mat,&mat);
m_pDXG->m_pD3DDevice->SetVertexShaderConstantF(0,(FLOAT *)&mat,4);
}
void settings_and_register()
{
m_pDXG->m_pD3DDevice->BeginStateBlock();
// レンダリングステートを設定
m_pDXG->m_pD3DDevice->SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
m_pDXG->m_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
m_pDXG->m_pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
// サンプラステート
// テクスチャステージステート
m_pDXG->m_pD3DDevice->EndStateBlock(&pStateBlock);
pStateBlock->Apply();
// 頂点宣言オブジェクトを登録する
m_pDXG->m_pD3DDevice->SetVertexDeclaration(pDecl);
// 頂点バッファインデックスバッファを登録
m_pDXG->m_pD3DDevice->SetStreamSource(0 ,pD3DVB_XYZ,0,sizeof(XYZBuffer) );
m_pDXG->m_pD3DDevice->SetStreamSource(1 ,pD3DVB_COLOR,0,sizeof(ColorBuffer) );
m_pDXG->m_pD3DDevice->SetIndices(pD3DIB);
// プログラマブルシェーダーを登録する
m_pDXG->m_pD3DDevice->SetVertexShader(vertex_shader);
m_pDXG->m_pD3DDevice->SetPixelShader(pixel_shader);
}
void render_object()
{
// レンダリング
m_pDXG->m_pD3DDevice->DrawIndexedPrimitive(
D3DPT_TRIANGLELIST,
0,0,8,0,12
);
}
};
[/code]
あれ? これどうして横に引き伸ばされるわけ?
あれ? これどうして横に引き伸ばされるわけ?
- 添付ファイル
-
- scr_cap.png (43.73 KiB) 閲覧数: 1184 回
最後に編集したユーザー T-ARCs on 2018年9月09日(日) 19:26 [ 編集 8 回目 ]
コメントはまだありません。