HLSL
ビルドが通んねぇ・・・orz
プログラミング MS DIRECTX9 グラフィックスパイプライン (マイクロソフト公式解説書)
- 作者: クリスグレイ,マイクロソフト,Kris M. Gray,クイープ
- 出版社/メーカー: 日経BP社
- 発売日: 2004/01/31
- メディア: 単行本
- クリック: 1回
- この商品を含むブログ (5件) を見る
以下の手順で SDK Update(October 2004)でもビルドできます。
http://ec.nikkeibp.co.jp/nsp/teisei/prog_dx.html
ビルド環境は、
-
- Windows 2000 SP4
- VisualC++ 6.0
- DirectX SDK 9.0 Update(October 2004) + Extras
- Platform SDK February 2003
上記だけでは色々足りなさそう。
これとか。
// d3dsettings.cpp INT_PTR CD3DSettingsDialog::ShowDialog( HWND hwndParent ) { #if 0 return DialogBox( NULL, MAKEINTRESOURCE( IDD_SELECTDEVICE ), hwndParent, DialogProcHelper ); #else return DialogBox( NULL, MAKEINTRESOURCE( IDD_SELECTDEVICE ), hwndParent, (DLGPROC)DialogProcHelper ); #endif }
これとか。
// d3dsettings.cpp #if 23 < D3DX_SDK_VERSION dwType = 0UL; TCHAR strSDKDir[ MAX_PATH ]; if ( 0 < ::GetEnvironmentVariable( _T("DXSDK_DIR"), strSDKDir, MAX_PATH - 1 ) ) { lResult = ERROR_SUCCESS; ::_sntprintf( strDest, cchDest, _T("%s\\Samples"), strSDKDir ); } else { lResult = ERROR_MORE_DATA; } #elif D3DX_SDK_VERSION == 23 lResult = RegQueryValueEx( hKey, _T("DX9D4SDK Samples Path"), NULL, &dwType, (BYTE*)strDest, &dwSize ); #elif D3DX_SDK_VERSION == 22 lResult = RegQueryValueEx( hKey, _T("DX9O4SDK Samples Path"), NULL, &dwType, (BYTE*)strDest, &dwSize ); #else lResult = RegQueryValueEx( hKey, _T("DX9J3SDK Samples Path"), NULL, &dwType, (BYTE*)strDest, &dwSize ); #endif
これとか。
// d3dsettings.cpp // Search in SDK's media dir #if 0 _sntprintf( strSearchPath, MAX_PATH, TEXT("%s%s"), strMediaDir, strLeafName ); strSearchPath[MAX_PATH-1] = 0; if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) bFound = TRUE; #else TCHAR strBuff[ MAX_PATH ]; WIN32_FIND_DATA stFindData; strBuff[ MAX_PATH - 1 ] = 0; strSearchPath[ MAX_PATH - 1 ] = 0; ::ZeroMemory( &stFindData, sizeof( WIN32_FIND_DATA ) ); ::_sntprintf( strBuff, MAX_PATH - 1, _T("%s*"), strMediaDir, strLeafName ); HANDLE hFind = ::FindFirstFile( strBuff, &stFindData ); if ( hFind != INVALID_HANDLE_VALUE ) { do { if ( ( stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) == 0 ) { if ( ::lstrcmp( stFindData.cFileName, strLeafName ) == 0 ) { _sntprintf( strSearchPath, MAX_PATH - 1, TEXT("%s%s"), strMediaDir, stFindData.cFileName ); } } else { _sntprintf( strSearchPath, MAX_PATH - 1, TEXT("%s%s\\%s"), strMediaDir, stFindData.cFileName, strLeafName ); } if( GetFileAttributes( strSearchPath ) != 0xFFFFFFFF ) { bFound = TRUE; break; } } while ( ::FindNextFile( hFind, &stFindData ) == TRUE ); (void)::FindClose( hFind ); } #endif
これとか。
// D3DXFillTextureTX => D3DXCreateTextureShader + D3DXFillTextureTX #if D3DX_SDK_VERSION < 22 hr = D3DXFillTextureTX(m_pTexture, (CONST DWORD*)pShader->GetBufferPointer(), NULL, 0); #else ID3DXTextureShader* pTextureShader; hr = D3DXCreateTextureShader( (CONST DWORD*)pShader->GetBufferPointer(), &pTextureShader ); if( FAILED(hr) ) { SAFE_RELEASE(pShader); SAFE_RELEASE(m_pTexture); return hr; } hr = D3DXFillTextureTX( m_pTexture, pTextureShader ); SAFE_RELEASE(pTextureShader); #endif SAFE_RELEASE(pShader); if( FAILED(hr) ) { SAFE_RELEASE(pShader); SAFE_RELEASE(m_pTexture); return hr; }
これとか。
// Pass => BeginPass + EndPass HRESULT hr; UINT numPasses, iPass; hr = m_pEffect->Begin( &numPasses, 0 ); for( iPass = 0; iPass < numPasses; ++iPass ) { #if D3DX_SDK_VERSION < 22 hr = m_pEffect->Pass( iPass ); #else hr = m_pEffect->BeginPass( iPass ); #endif // ・・・ #if D3DX_SDK_VERSION < 22 #else hr = m_pEffect->EndPass(); #endif } hr = m_pEffect->End();
これとか。
hr = D3DXCreateEffectFromFile( m_pd3dDevice, "Simple_VS_Asm.fx", NULL, // NULL terminated string of D3DXMACROs NULL, // #include handler #if D3DX_SDK_VERSION < 32 D3DXSHADER_DEBUG, #else D3DXSHADER_DEBUG | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, #endif NULL, // memory pool &m_pEffect, NULL);
これとか。
hr = D3DXCreateEffectFromResource( m_pd3dDevice, NULL, MAKEINTRESOURCE(ID_HLSL_GLOW), NULL, // NULL terminated list of D3DXMACROs NULL, // #include handler #if D3DX_SDK_VERSION < 32 D3DXSHADER_DEBUG, #else D3DXSHADER_DEBUG | D3DXSHADER_USE_LEGACY_D3DX9_31_DLL, #endif NULL, // memory pool &m_pEffect, NULL);
後はH/W依存なのか頂点シェーダのターゲットが「vs_1_1」だとReleaseビルドで動作しなかった。「vs_2_0」に変更したらOKだった。
VisualC++2005の場合はマニフェストを無効にしたらコンパイルは通る。あとDirectXのライブラリが内部的にリンクしているシングルスレッドライブラリがVisualC++2005にはないのでリンカで無効にする。
#if 1400 <= _MSC_VER #pragma comment( linker, "/NODEFAULTLIB:\"libcp\"" ) #endif
コレで一応サンプルの実行結果が拝めるようになった。
それにしてもShaderの動作が全く理解不能・・・。この週末Linuxばっか弄って全然勉強進まなかったorz