桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

HLSL

ビルドが通んねぇ・・・orz

プログラミング MS DIRECTX9 グラフィックスパイプライン (マイクロソフト公式解説書)

プログラミング MS DIRECTX9 グラフィックスパイプライン (マイクロソフト公式解説書)

以下の手順で SDK Update(October 2004)でもビルドできます。
http://ec.nikkeibp.co.jp/nsp/teisei/prog_dx.html

ビルド環境は、

上記だけでは色々足りなさそう。
これとか。

// 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