VertexShader のプログラム組み込み
「VertexShader インチキ環境マッピング+いろいろ 」などのソースの場合、ヴァーテックスシェーダーのプログラムのファイル「vsample01.vsh」を読み込んで使用していたのですがCのソースに埋め込んで見ましょう。
G9lib.cpp
: //------------------------------------------------------------------------------ //■ライブラリ初期化 //------------------------------------------------------------------------------ bool G9lib::Init( HWND hwnd ) { const char VertexShader[] = "vs_1_1\n"\ "def c4, 0.0f, 0.5f, 1.0f, 0.20f\n"\ "def c5, 0.566f, 0.566f, 0.566f, 0.0f\n"\ "def c6, 1.0f, 0.5f, 0.0f, 0.0f\n"\ "def c7, 0.0f, 0.0f, 0.5f, 0.0f\n"\ "dcl_position v0\n"\ "dcl_normal v1\n"\ "m4x4 oPos, v0, c0\n"\ "m3x3 r0, v1, c0\n"\ "dp3 r0.w, r0, r0\n"\ "rsq r1, r0.w\n"\ "mul r0, r0, r1\n"\ "mad oT0.xy,r0.xy,c4.yy,c4.yy\n"\ "dp3 r0.w, r0, c5\n"\ "mad r0.x, r0.w, c4.y, c4.y\n"\ "sub r0.y, c4.z, r0.x\n"\ "mul r1, r0.x, c6\n"\ "mad oD0, r0.y, c7, r1\n"\ "mul r0.x, r0.x, r0.x\n"\ "mul r0.x, r0.x, r0.x\n"\ "mul oD1, r0.x, r0.x\n"; // Direct3Dオブジェクトの取得 pD3D = Direct3DCreate9(D3D_SDK_VERSION); if (pD3D == NULL) { MessageBox( hwnd, L"Direct3Dの初期化に失敗しました、DirectX 9.0がインストールされているか確認してください。",L"Base",MB_OK | MB_ICONSTOP); return FALSE; } // 現在のディスプレイモードを得る D3DDISPLAYMODE dmode; if (FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode))) { MessageBox( hwnd, L"ディスプレイモードの取得に失敗しました。",L"Base",MB_OK | MB_ICONSTOP); return FALSE; } // バックサーフェースのフォーマットをコピーして使用する ZeroMemory(&d3dppApp, sizeof(d3dppApp)); d3dppApp.Windowed = TRUE; // ウィンドウモード d3dppApp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 垂直同期でフリップ d3dppApp.BackBufferCount = 1; d3dppApp.BackBufferFormat = dmode.Format; d3dppApp.EnableAutoDepthStencil = TRUE; d3dppApp.AutoDepthStencilFormat= D3DFMT_D16; // デバイスの作成 if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) { if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) { MessageBox( hwnd, L"デバイスの作成に失敗しました、画面モードが16ビットあるいは32ビットになっていることを確認してください。",L"Base",MB_OK | MB_ICONSTOP); return FALSE; } } //------------------------------------------------------------------- ID3DXBuffer* pshader; if ( FAILED(D3DXAssembleShader( VertexShader , sizeof(VertexShader) - 1, 0 , NULL , 0, &pshader , NULL ))) return FALSE; if( FAILED(pD3DDevice->CreateVertexShader((DWORD*)pshader->GetBufferPointer(),&vShader) )){ pshader->Release(); return FALSE; } pshader->Release(); //----------------------------------------- // モデル登録 void *lpVertices; HRESULT hr; hr = pD3DDevice->CreateVertexBuffer(sizeof(modelData), 0, D3DVERNORMAL::FVF, D3DPOOL_DEFAULT, &gVBuffer, NULL ); if (FAILED(hr)) return FALSE; // 頂点バッファをコピー hr = gVBuffer->Lock(0, sizeof(modelData), (LPVOID*)&lpVertices, 0); if (FAILED(hr)) return FALSE; memcpy(lpVertices, modelData, sizeof(modelData)); gVBuffer->Unlock(); //----------------------------------------- //テクスチャ読み込み if( D3DXCreateTextureFromFile(pD3DDevice, L"../VertexShader/image01.bmp", &image01 ) != D3D_OK ) image01 = NULL; return TRUE; } :
初期化の部分でこのように書いてしまえば、わざわざプログラムを読み込まなくても使えるようになります。
ここにシェーダープログラムを書きます
const char VertexShader[] = "vs_1_1\n"\ "def c4, 0.0f, 0.5f, 1.0f, 0.20f\n"\ "def c5, 0.566f, 0.566f, 0.566f, 0.0f\n"\ "def c6, 1.0f, 0.5f, 0.0f, 0.0f\n"\ "def c7, 0.0f, 0.0f, 0.5f, 0.0f\n"\ "dcl_position v0\n"\ "dcl_normal v1\n"\ "m4x4 oPos, v0, c0\n"\ "m3x3 r0, v1, c0\n"\ "dp3 r0.w, r0, r0\n"\ "rsq r1, r0.w\n"\ "mul r0, r0, r1\n"\ "mad oT0.xy,r0.xy,c4.yy,c4.yy\n"\ "dp3 r0.w, r0, c5\n"\ "mad r0.x, r0.w, c4.y, c4.y\n"\ "sub r0.y, c4.z, r0.x\n"\ "mul r1, r0.x, c6\n"\ "mad oD0, r0.y, c7, r1\n"\ "mul r0.x, r0.x, r0.x\n"\ "mul r0.x, r0.x, r0.x\n"\ "mul oD1, r0.x, r0.x\n";
このプログラムを以下の部分で登録します。
//------------------------------------------------------------------- ID3DXBuffer* pshader; if ( FAILED(D3DXAssembleShader( VertexShader , sizeof(VertexShader) - 1, 0 , NULL , 0, &pshader , NULL ))) return FALSE; if( FAILED(pD3DDevice->CreateVertexShader((DWORD*)pshader->GetBufferPointer(),&vShader) )){ pshader->Release(); return FALSE; } pshader->Release();