/*
This is a simple vertex shader program which illustrate how to use vertex shader instead of fixed pipeline
to perform world, view and projection transform
*/
#include <d3dx9.h>
#include <MMSystem.h>
LPDIRECT3D9 g_pD3D = NULL ; // Used to create the D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL ; // Our rendering device
ID3DXMesh* g_pMesh = NULL ; // Hold the sphere
// vertex shader declaration
IDirect3DVertexShader9* g_pVertexShader = NULL ; // vertex shader
ID3DXConstantTable* g_pConstantTable = NULL ; // shader constant table
// Handle for world, view and projection matrix
// We use this variable to communicate between the effect file Shader.txt and the C++ code
D3DXHANDLE ViewProjMatrixHanle = 0 ;
void SetupMatrix() ;
bool PrepareShader() ;
HRESULT InitD3D( HWND hWnd )
{
// Create the D3D object, which is needed to create the D3DDevice.
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;
// Create device
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
// Turn off culling, so we see the front and back of the triangle
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
//g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING , FALSE );
// Create a teapot
D3DXCreateTeapot(g_pd3dDevice, &g_pMesh, NULL) ;
// Prepare Shader
PrepareShader() ;
// Setup matrix
SetupMatrix() ;
return S_OK;
}
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
if(g_pMesh != NULL)
g_pMesh->Release() ;
}
bool PrepareShader()
{
// Buffer to hold the compiled code
ID3DXBuffer* codeBuffer = NULL;
// Buffer to hold the error message if compiled failed
ID3DXBuffer* errorBuffer = NULL;
// Compile shader from file
HRESULT hr = D3DXCompileShaderFromFileA("vertexshader.txt", 0, 0, "Main",
"vs_1_1", D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY, &codeBuffer,
&errorBuffer, &g_pConstantTable);
// Output any error messages
if(errorBuffer != NULL)
{
MessageBoxA(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
errorBuffer->Release();
return false;
}
if(FAILED(hr))
{
MessageBoxA(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0);
return false;
}
// Create vertex shader
hr = g_pd3dDevice->CreateVertexShader((DWORD*)codeBuffer->GetBufferPointer(), &g_pVertexShader);
// Handling error
if(FAILED(hr))
{
MessageBoxA(0, "CreateVertexShader() - FAILED", 0, 0);
return false;
}
// Release code buffer
if(codeBuffer != NULL)
{
codeBuffer->Release();
codeBuffer = NULL;
}
// Release error buffer
if(errorBuffer != NULL)
{
errorBuffer->Release();
errorBuffer = NULL;
}
// Set handle
ViewProjMatrixHanle = g_pConstantTable->GetConstantByName(0, "gWVP");
return true;
}
void SetupMatrix()
{
D3DXVECTOR3 vEye(0.0f, 0.0f, -1.0f);
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
// Set view matrix
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp);
// Set projection matrix
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI * 0.25f, 1.0f, 1.0f, 1000.0f);
D3DXMATRIX matViewProj = matView * matProj;
g_pConstantTable->SetMatrix(g_pd3dDevice, ViewProjMatrixHanle, &matViewProj);
// this line is mandatory if you have used Constant table in your code
g_pConstantTable->SetDefaults(g_pd3dDevice);
}
VOID Render()
{
// Clear the back-buffer to a red color
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, 0xffff0000, 1.0f, 0);
// Begin the scene
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// Set Vertex Shader
g_pd3dDevice->SetVertexShader(g_pVertexShader);
// Render teapot
g_pMesh->DrawSubset(0);
// Unset vertex shader
g_pd3dDevice->SetVertexShader(NULL);
// End the scene
g_pd3dDevice->EndScene();
}
// Present the back-buffer content to the display
g_pd3dDevice->Present(NULL, NULL, 0, NULL);
}
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_KEYDOWN:
{
switch( wParam )
{
case VK_ESCAPE:
SendMessage( hWnd, WM_CLOSE, 0, 0 );
break ;
default:
break ;
}
}
break ;
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX winClass ;
winClass.lpszClassName = L"Teapot";
winClass.cbSize = sizeof(WNDCLASSEX);
winClass.style = CS_HREDRAW | CS_VREDRAW;
winClass.lpfnWndProc = MsgProc;
winClass.hInstance = hInstance;
winClass.hIcon = NULL ;
winClass.hIconSm = NULL ;
winClass.hCursor = NULL ;
winClass.hbrBackground = NULL ;
winClass.lpszMenuName = NULL ;
winClass.cbClsExtra = 0;
winClass.cbWndExtra = 0;
RegisterClassEx (&winClass) ;
HWND hWnd = CreateWindowEx(NULL,
winClass.lpszClassName, // window class name
L"Teapot", // window caption
WS_OVERLAPPEDWINDOW, // window style
0, // initial x position
0, // initial y position
500, // initial window width
500, // initial window height
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
// Create window failed
if(hWnd == NULL)
{
MessageBoxA(hWnd, "Create Window failed!", "Error", 0) ;
return -1 ;
}
// Initialize Direct3D
if( SUCCEEDED(InitD3D(hWnd)))
{
// Show the window
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// Enter the message loop
MSG msg ;
ZeroMemory( &msg, sizeof(msg) );
PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
// Get last time
static DWORD lastTime = timeGetTime();
while (msg.message != WM_QUIT)
{
if( PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0)
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
else // Render the game if there is no message to process
{
// Get current time
DWORD currTime = timeGetTime();
// Calculate time elapsed
float timeDelta = (currTime - lastTime)*0.001f;
// Render
Render() ;
// Update last time to current time for next loop
lastTime = currTime;
}
}
}
UnregisterClass(winClass.lpszClassName, hInstance) ;
return 0;
}
http://www.cnblogs.com/graphics/archive/2010/08/13/1799200.html
// World, View and Projection Matrix
uniform extern float4x4 gWVP;
// Output Vertex structure
struct OutputVS
{
float4 posH : POSITION0;
};
OutputVS Main(float3 posL : POSITION0)
{
// Zero out our output.
OutputVS outVS = (OutputVS)0;
// Transform to homogeneous clip space.
outVS.posH = mul(float4(posL, 1.0f), gWVP);
// Done--return the output.
return outVS;
}
原文链接: https://www.cnblogs.com/ketmales/archive/2012/05/05/2485417.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/49506
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!