BOOL CD3DVidRender::Setup_Texture(HWND hwnd,IDirect3DDevice9* Device, int Width, int Height, RENDER_DATA_TYPE data_type)
{
if (!Device)
{
return false ;
}
Device = m_pDirect3DDevice ;
HRESULT hr = 0;
float x_w = Width / 2 ;
float y_h = Height / 2 ;
hr = Device->CreateVertexBuffer(
4 * sizeof(MultiTexVertex),
D3DUSAGE_WRITEONLY,
MultiTexVertex::FVF,
D3DPOOL_MANAGED,
&QuadVB,
0);
MultiTexVertex* v = 0;
QuadVB->Lock(0, 0, (void**)&v, 0);
v[0] = MultiTexVertex(-20.0f, 20.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
v[1] = MultiTexVertex( 20.0f, 20.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f);
v[2] = MultiTexVertex( 20.0f, -20.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
v[3] = MultiTexVertex(-20.0f, -20.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f);
QuadVB->Unlock();
RECT rc ;
GetClientRect(hwnd,&rc) ;
float v_z = (float)Width / (float)rc.right ;
D3DXMATRIX P;
D3DXMatrixPerspectiveFovLH(&P,
D3DX_PI * 0.5f,
1.0f,
1.0f, //近裁减面到坐标原点的距离
1000.0f //远裁减面到原点的距离
);
Device->SetTransform(D3DTS_PROJECTION, &P);
Device->SetRenderState(D3DRS_LIGHTING, false);
m_RadiusFirst = m_Radius = 20 ;
m_AngleFirst = m_Angle = (3.0f * D3DX_PI) / 2.0f;
D3DXVECTOR3 position( x_Cam, y_Cam, sinf(m_Angle) * m_Radius);
D3DXVECTOR3 target(x_Cam, y_Cam, 0.0f);
D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
D3DXMATRIX V;
D3DXMatrixLookAtLH(&V, &position, &target, &up);//计算取景变换矩阵
m_pDirect3DDevice->SetTransform(D3DTS_VIEW, &V);//取景变换
if(data_type == RENDER_DATA_TYPE_YUV420P)
{
ID3DXBuffer* shader = 0;
ID3DXBuffer* errorBuffer = 0;
hr = D3DXCompileShaderFromFile(
"E:\\workspace\\Shader\\SDKTexShaderDemo\\SDKTexShaderDemo\\ps_yuv420p.txt",
0,
0,
"Main", // entry point function name
"ps_2_0",
D3DXSHADER_DEBUG,
&shader,
&errorBuffer,
&MultiTexCT);
if( errorBuffer )
{
::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
errorBuffer->Release() ;
}
if(FAILED(hr))
{
::MessageBox(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0);
return false;
}
hr = Device->CreatePixelShader((DWORD*)shader->GetBufferPointer(), &MultiTexPS);
if(FAILED(hr))
{
::MessageBox(0, "CreateVertexShader - FAILED", 0, 0);
return false;
}
if (shader)
{
shader->Release() ;
}
Device->CreateTexture ( Width, Height, 1, D3DUSAGE_DYNAMIC, D3DFMT_L8, D3DPOOL_DEFAULT, &YTex, NULL ) ;
Device->CreateTexture ( Width / 2, Height / 2, 1, D3DUSAGE_DYNAMIC, D3DFMT_L8, D3DPOOL_DEFAULT, &UTex, NULL ) ;
Device->CreateTexture ( Width / 2, Height / 2,