|
现在已经实现了.但是柔边效果没有了.贴出代码.大家帮帮忙啊!
#include <windows.h>
#include <windowsx.h>
#include <d3dx9.h>
#include <d3d9.h>
#include <stdio.h>
// 默认的全局变量
HWND g_Hwnd;
HINSTANCE g_hInstance;
IDirect3D9* g_D3d;
IDirect3DDevice9* g_Device;
ID3DXSprite* g_Sprite;
// 自定义的全局变量
ID3DXMesh* mesh;
ID3DXConstantTable* constant;
ID3DXBuffer* shader;
ID3DXBuffer* error;
IDirect3DVertexShader9* vertexShader;
IDirect3DPixelShader9* pixelShader;
D3DXMATRIX view, proj;
IDirect3DVertexDeclaration9* vDecl;
IDirect3DTexture9 *tex1,*tex2,*tex3;
D3DXCONSTANT_DESC des1,des2,des3;
IDirect3DVertexBuffer9* vb;
ID3DXConstantTable* DiffuseConstTable = 0;
ID3DXMesh* Teapot = 0;
D3DXHANDLE Handle1 = 0;
D3DXHANDLE Handle2 = 0;
D3DXHANDLE Handle3 = 0;
D3DXHANDLE Handle4 = 0;
D3DXHANDLE Handle5 = 0;
D3DXHANDLE Handle6 = 0;
D3DXHANDLE Handle7 = 0;
IDirect3DVertexShader9* DiffuseShader = 0;
ID3DXEffect *effect = NULL;
// 位图的信息
HDC g_hDC = NULL;
HBITMAP g_hBitmap = NULL;
WORD* g_Buffer = NULL;
struct VERTEX
{
VERTEX( float x, float y, float z, float rhw, float u, float v )
{
_x = x;
_y = y;
_z = z;
_rhw = rhw;
_u = u;
_v = v;
}
float _x, _y, _z,_rhw;
float _u, _v;
static DWORD fvf;
};
DWORD VERTEX::fvf = D3DFVF_XYZRHW | D3DFVF_TEX1;
bool D3DInit() // D3D初始化
{
// 创建D3D接口
g_D3d = Direct3DCreate9( D3D_SDK_VERSION );
if( !g_D3d )
return false;
// 创建D3DDevice接口
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(D3DPRESENT_PARAMETERS) );
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferCount = 1;
d3dpp.hDeviceWindow = g_Hwnd;
d3dpp.Windowed = true;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.EnableAutoDepthStencil = true;
if( FAILED(g_D3d->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_Hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_Device ) ))
return false;
return true;
}
void MoveCamera()
{
static float angel1 = 0, angel2 = 0, x = 0, y = 0, z = -10;
static float range = 20;
// 移动相机的规则为,键盘的方向键控制相机在一个圆上
// 根据键盘的操作来设置值
if( GetAsyncKeyState( VK_LEFT) & 0x8000 )
{
angel1 -= 0.001f;
}
if( GetAsyncKeyState( VK_RIGHT) & 0x8000 )
{
angel1 += 0.001f;
}
if( GetAsyncKeyState( VK_UP) & 0x8000 )
{
angel2 += 0.001f;
}
if( GetAsyncKeyState( VK_DOWN) & 0x8000 )
{
angel2 -= 0.001f;
}
if( GetAsyncKeyState( 'Z' ) & 0x8000 )
{
range += 0.01f;
if( range > 1000 )
range = 1000;
}
if( GetAsyncKeyState( 'X' ) & 0x8000 )
{
range -= 0.01f;
if( range < 0.3 )
range = 0.3;
}
// 计算XYZ
y = range * cosf( angel2 );
float temp = range * sinf( angel2 );
x = temp * cosf( angel1 );
z = temp * sinf( angel1 );
// 设置相机
D3DXMATRIX matrix;
D3DXVECTOR3 pos( x, y, z), at( 0, 0, 0), up( 0, 1, 0 );
D3DXMatrixLookAtLH( &view, &pos, &at, &up );
g_Device->SetTransform( D3DTS_VIEW, &view );
}
bool UserInit() // 用户初始化
{
// 设置观察矩阵
D3DXMATRIX matrix;
D3DXMatrixPerspectiveFovLH( &proj, D3DX_PI/2, 1.333f, 1, 5000 );
//g_Device->SetTransform( D3DTS_PROJECTION, &proj );
g_Device->SetRenderState( D3DRS_LIGHTING, false );
g_Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
g_Device->SetRenderState( D3DRS_SRCBLENDALPHA, D3DBLEND_SRCALPHA );
g_Device->SetRenderState( D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
// 载入一张纹理
D3DXCreateTextureFromFile(g_Device, "a.bmp", &tex1);
// 创建一张自定义的纹理
g_Device->CreateTexture (800, 600, 1, 0,
D3DFMT_R5G6B5 , D3DPOOL_MANAGED, &tex2, NULL) ;
//////////////////////////////////////////////////////////////////////////
g_Device->CreateVertexBuffer(
6 * sizeof(VERTEX),
D3DUSAGE_WRITEONLY,
VERTEX::fvf,
D3DPOOL_MANAGED,
&vb,
0);
VERTEX* v;
vb->Lock(0, 0, (void**)&v, 0);
//v[0] = VERTEX(-1.0f, -1.0f, 1.25f, 0.0f, 1.0f);
// v[1] = VERTEX(-1.0f, 1.0f, 1.25f, 0.0f, 0.0f);
// v[2] = VERTEX( 1.0f, 1.0f, 1.25f, 1.0f, 0.0f);
//
// v[3] = VERTEX(-1.0f, -1.0f, 1.25f, 0.0f, 1.0f);
// v[4] = VERTEX( 1.0f, 1.0f, 1.25f, 1.0f, 0.0f);
// v[5] = VERTEX( 1.0f, -1.0f, 1.25f, 1.0f, 1.0f);
v[0] = VERTEX(0.0f, 0.0f, 0, 1, 0.0f, 0.0f);
v[1] = VERTEX(640.0f, 0.0f, 0, 1, 1.0f, 0.0f);
v[2] = VERTEX(0.0f, 480.0f, 0, 1, 0.0f, 1.0f);
v[3] = VERTEX(640.0f, 0.0f, 0, 1, 1.0f, 0.0f);
v[4] = VERTEX(640.0f, 480.0f, 0, 1, 1.0f, 1.0f);
v[5] = VERTEX(0.0f, 480.0f, 0, 1, 0.0f, 1.0f);
vb->Unlock();
// 创建设备环境,并且在上面写
HFONT font = CreateFont(100, 0, 0, 0, 400, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH, "楷体_GB2312");
g_hDC = CreateCompatibleDC(NULL);
SelectObject(g_hDC, font);
TEXTMETRIC tm;
GetTextMetrics(g_hDC, &tm);
int height = tm.tmHeight;
int width = tm.tmMaxCharWidth;
BITMAPINFO info;
memset(&info, 0, sizeof(info));
info.bmiHeader.biSize = sizeof(info.bmiHeader);
info.bmiHeader.biBitCount = 16;
info.bmiHeader.biCompression = BI_BITFIELDS;
info.bmiHeader.biHeight = height;
info.bmiHeader.biWidth = width;
info.bmiHeader.biPlanes = 1;
int BMPINFO16[13] =
{
sizeof(BITMAPINFOHEADER),
0, // 宽度
0, // 高度
0x100001,BI_BITFIELDS,0,0,0,0,0,
0xf800,0x7e0,0x1f
};
BMPINFO16[1] = width;
BMPINFO16[2] = -height;
g_hBitmap = CreateDIBSection(g_hDC, (BITMAPINFO*)BMPINFO16, DIB_RGB_COLORS, (void**)&g_Buffer, 0, 0);
SelectObject(g_hDC, g_hBitmap);
SetTextColor(g_hDC, 0xffffff);
SetBkColor(g_hDC, 0);
// 在HDC里面写字
TextOut(g_hDC, 0, 0, "永", 2);
// 把文字放到位图上
D3DLOCKED_RECT LockRect;
tex2->LockRect(0, &LockRect, NULL, 0);
BYTE* buff1 = (BYTE*)LockRect.pBits;
for ( int m = 0; m < 600; m++)
{
memset(buff1, 0, LockRect.Pitch);
buff1 += LockRect.Pitch;
}
//////////////////////////////////////////////////////////////////////////
// 自己定义一种颜色
WORD color = 0xffff;
BYTE color1[3] = {255, 0, 0};
BYTE color2[3] = {0};
BYTE* buff = (BYTE*)g_Buffer;
// 先把纹理指针移动到要写的位置,这里我用100,100
buff1 = (BYTE*)LockRect.pBits + 200 * LockRect.Pitch + 100 * 2;
for (int i = 0; i < height; i++, buff1 += LockRect.Pitch)
{
for (int j = 0; j < width; j++)
{
/*WORD aa = 0;
memcpy(&aa, &buff[j*2], 2);
if (aa == 0)
{
//continue;
}
WORD w;
memcpy(&w, &buff[j*2], 2);
float f = w / 65535.0f;
// 得到三种颜色,然后分别进行ALPHA
BYTE r = (color & 0xf800) >> 8;
BYTE g = (color & 0x7e0) >> 3;
BYTE b = (color & 0x1f) << 3;
r = r * f + (1-f) * 0;
g = g * f + (1-f) * 0;
b = b * f + (1-f) * 0;
WORD temp = (r << 8) | (g << 3) | (b >> 3);*/
// 先把DC上的象素放到颜色里面
memcpy(buff1, &buff[i*width*2], width*2);
//memcpy(&buff1[j*2], &temp, 2);
}
}
//////////////////////////////////////////////////////////////////////////
tex2->UnlockRect(0);
return true;
}
void Run() // 程序运行
{
// 移动相机
MoveCamera();
// 渲染
g_Device->Clear( 0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xff00ffff, 1.0f, 0 );
g_Device->BeginScene( );
g_Device->SetTexture(0,tex2);
g_Device->SetFVF(VERTEX::fvf);
g_Device->SetStreamSource(0, vb, 0, sizeof(VERTEX));
g_Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
g_Device->EndScene();
g_Device-> resent( 0, 0, 0, 0 );
}
void ShutDown() // 卸载
{
if( g_D3d )
g_D3d->Release();
g_D3d = NULL;
if( g_Device )
g_Device->Release();
g_Device = NULL;
}
//////////////////////////////////////////////////////////////////////////
HRESULT CALLBACK WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_CLOSE:
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
BitBlt(hdc, 200, 100, 100, 100, g_hDC, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc( hwnd, uMsg, wParam, lParam );
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
// 创建窗口
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Window";
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW | CS_HREDRAW;
if( !RegisterClass(&wc) )
return -1;
g_Hwnd = CreateWindow( "Window", "Shader", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
800, 600, NULL, NULL, hInstance, NULL );
g_hInstance = hInstance;
ShowWindow( g_Hwnd, nShowCmd );
UpdateWindow( g_Hwnd );
// D3D9的初始化
if( !D3DInit() )
return -1;
if( !UserInit() )
return -1;
// 消息循环
MSG msg;
while( true )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE) )
{
if( msg.message == WM_QUIT )
break;
TranslateMessage( &msg );
DispatchMessage( &msg );
}
// 渲染
//Run();
}
// 卸载
ShutDown();
return 0;
} |
|