読者です 読者をやめる 読者になる 読者になる

syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Vulkan SDK付属のGLSLコンパイラー

2016年2月にVulkanの正式仕様とSDKがリリースされ、その後NVIDIAやAMDなど大手GPUベンダー各社からもPC向け正式ドライバーがリリースされ始めているので、そろそろ試してみることにしました。まずはシェーダーのコンパイラーまわりから入ります。ちなみにVul…

自作MetasequoiaプラグインをGitHubで公開しました

かつて2007年~2008年頃、こっそり自分のためだけに開発したMetasequoiaプラグインのソースコードがHDDの肥やしになっていたので、Gitの練習も兼ねてGitHubに移管・オープンソース化しました。ライセンスはMITです。 GitHub - sygh-JP/SyghMQPlugins: Metase…

Visual Studio 2015とD3DCompiler

Visual Studio 2015でビルドした、DirectX 11.1を使ったMFC/WPF混合アプリをWindows 7のエクスプローラーから起動すると、起動直後に勝手に終了する現象が出ました*1。 しかし、終了時にWindowsからクラッシュエラーのタスクダイアログも表示されないし、イ…

XAudio2とMedia FoundationでMP3/WMA再生

経緯 以前、DirectXの学習を兼ねて開発していたゲームエンジン(C++で様々なDirectX APIを直接叩いていました)では、効果音 (SE) の再生にXACT3を、BGMの再生にDirectShowを使っていました。本当はBGMにもXACT3を使ってもよかったのですが、MP3/WMAフォーマ…

Direct3D 12 (DirectX 12) の簡単なサンプル

(本記事の内容は執筆時点の暫定仕様に基づくものです。実際の最終製品版とは異なる可能性があります)GDCの開催された2015年3月にはすでにDirect3D 12 (DirectX 12) の暫定ドキュメントとVisual Studio 2015 CTPが公開されていたのですが、肝心の実行環境で…

NVIDIAのOpenCL対応状況

NVIDIAのOpenCLドライバーはIntelやAMDと比べて規格への対応が遅く、2015年2月時点でもOpenCL 1.1どまりです。NVIDIAのOpenCL SDKとなるCUDA Toolkitも、7.0時点でOpenCL 1.1までしか対応しません(cl.hに定義されているのはCL_VERSION_1_1まで)。例えばOpe…

CUDA Warpシャッフル命令のエミュレーション

今更ですがせっかくCompute Capability 3.0対応のKepler世代グラフィックスカードを手に入れたので、CUDAのWarpシャッフル命令の動作テストを兼ねて、代替機能をエミュレートする関数を書いてみました。 Visual Studio 2012、CUDA 6.5、GeForce GTX 770で動…

VS 2008のWPF-MFC相互運用

(これは2011-03-18に書いた故OCNブログの記事を移植したものです)以下を参考に、MFC アプリから WPF を使おうとして、Visual Studio 2008 SP1 のバグに遭遇しました。 WPF ユーザー コントロールを HwndSource 経由でホストする Win32 アプリ……といいつつ…

CButtonとCMFCButtonの比較

(これは2010-06-20に書いた故OCNブログの記事を移植したものです)Visual Studio 2008 SP1にて導入された、MFC Feature Pack付属のCMFCButtonは、従来のCButtonに比べてかなり強力です。微妙に使い勝手が違う部分もありますが、ボタンの文字色変更とか、画…

CScrollViewの代わりにCViewでスクロール

(これは2010-09-07に書いた故OCNブログの記事を移植したものです)MFCのCScrollViewは便利なんですが、画像編集ソフトのようなものを作ろうとしたとき、いかんせん細かい制御がしづらいというか、CScrollView::SetScrollSizes()などのユーティリティ メンバ…

ATL::CPathユーティリティ

(これは2010-10-31に書いた故OCNブログの記事を移植したものです)Visual C++ 付属の ATL にはわりと便利なユーティリティ クラスがあるんですが、あまり知られてないのでひとつ紹介します。ATL::CPathこいつは Windows Shell API の Path*関数を薄くラップ…

WinSDKおよびATLのCOMユーティリティ

(これは2010-11-23に書いた故OCNブログの記事を移植したものです)MSXMLなどのCOMタイプ ライブラリを#importしたときなど、COMを扱うときによく見かけるのが、Visual C++ CRTヘルパーの _bstr_t クラスと _variant_t クラス(comutil.h)です。それぞれ、C…

MFC-CLI 相互運用時の注意点‏

(これは2011-05-09に書いた故OCNブログの記事を移植したものです)それなりに規模の大きい MFC プロジェクトなどで、共通言語ランタイムのサポート /clr を追加して .NET ハイブリッド アプリケーションを作るときに、起動時に EETypeLoadException 例外が…

MFCのCFileDialog::SetDefExt()の引数の型について

(これは2010-06-05に書いた故OCNブログの記事を移植したものです) バグの発見、MS Connect への報告と顛末 Visual Studio 2008/2010 の MFC 9.0/10.0 では、CFileDialog::SetDefExt() の引数の型が間違っていて、本来 LPCTSTR (LPCWSTR for UNICODE / LPCS…

Effects10, Effects11の実行時コンパイル

(これは2013-05-11に書いた故OCNブログの記事を移植したものです)以前書いた、「Effects11 for Windowsストア アプリ」の記事とは趣旨が逆行する話ですが、一応参考程度に書き残しておきます。デスクトップ アプリでは実行時コンパイルを使うこともできま…

Effects11 for Windowsストア アプリ

(これは2013-04-13に書いた故OCNブログの記事を加筆修正したものです)今回は旧D3DXライブラリの歴史にちょっとだけ触れるので、前置きが長いです。Windowsストア アプリを開発できるVisual Studio 2012用のDirectX SDK(Windows SDK 8.0)では、これまでDi…

Visual C++ 2010 SP1でのMFC拡張

(これは2011-05-27に書いた故OCNブログの記事を移植したものです)Microsoftが.NETに注力を始めてからずいぶんと影が薄くなったのが、Visual C++向けのWin32 APIラッパー/デスクトップアプリケーションフレームワークであるMFCなんですが、VC 2010になって…

GDI+でアンチエイリアスEMFを作成

(これは2012-09-08に書いた故OCNブログの記事を移植したものです)MFCのCMetaFileDCでWindows拡張メタファイル(EMF)を作成した場合、たとえGdiplus::Graphics::FromHDC()でバインドしたGDI+グラフィックスを使ってそのメタファイルを描画してもアンチエイ…

Windows SDKと旧DirectX SDK

DirectX SDKはJune 2010がリリースされた後、まったく新しいバージョンが出ない時期が続いたんですが、Visual Studio 2012にバンドルされているWindows SDK 8.0において、DirectX SDKはWindows SDKと統合されました。 Windows SDK for Windows 8 – Windows D…

可変個引数のダークサイド

(これは2010-11-07に書いた故OCNブログの記事を移植したものです)C/C++ の可変個引数はとても強力です。こいつにお世話にならない人はおそらくほとんど居ないと言っても過言ではありません。とくに printf/scanf 系の文字列入出力関数は、C++ のストリーム…

コンテナと値型・ポインタ型

(これは2010-11-14に書いた故OCNブログの記事を移植したものです)STL コンテナ クラス テンプレート(std::vector, std::list など)や MFC/ATL コレクション クラス テンプレート(CArray / CAtlArray, CList / CAtlList)のテンプレート引数に、値型をつ…

Direct2D Effectsで発光する雷をプロシージャル生成する

Windows 8で使えるようになったDirect2D 1.1には、多数の便利な機能が追加されています。ブレンドモード(Composite Mode)の制御のほか、シェーダーを利用したエフェクトが使えるようになりました。 エフェクトは頂点シェーダーで実装されているとおぼしき…

Visual StudioのツールボックスにWin32/MFC向けのコントロール一覧が表示されないとき

これはときどき発生する現象で、Visual Studio 2008など以前のバージョンでも存在していた現象なのですが、今回Windows 8.1にインストールしたVisual Studio 2012/2013両方にて発生しました。 何が原因でこの現象が発生するのかはよく分かっていないんですが…

OpenGLコンピュートシェーダー

(これは2013-01-30に書いた故OCNブログの記事を移植したものです)2013-01-05に公開されたNVIDIAのリテールドライバー310.90で、ようやくOpenGL 4.3が正式に使えるようになりました。最新世代のKeplerのほか、旧世代のFermiアーキテクチャのグラフィックス…

size_t, ptrdiff_tのprintf書式指定

(これは2010-12-05に書いた故OCNブログの記事を移植したものです)size_tとptrdiff_tはポインタ同様、32bit向け(_M_IX86とか)と64bit向け(_M_X64とか)でサイズと上下限が変わるプラットフォーム依存の整数型なので、printf()系の関数で出力する場合、書…

C++正規表現ライブラリ(Regex)でCSV解析

(これは2011-01-30に書いた故OCNブログの記事を移植したものです)C++11 (C++0x TR1) には正規表現ライブラリとして <regex> が存在するんですが、こいつを使って簡単なCSV文字列解析処理を書いてみました。参考にしたのは下記。 CSV形式のファイルをDataTableや配</regex>…

shared_ptrとconst

(これは2011/01/17に書いた故OCNブログの記事を加筆修正したものです)あんまり言及してる人がいないんですが、これはshared_ptrとconstを組み合わせて使う上でとても重要な機能です。普通組込のconstポインタあるいはconst参照経由では、const操作しかでき…

C++のmutableの使い道

(これは2010-10-20に書いた故OCNブログの記事を加筆修正したものです)C++のmutableはconstメソッド内でも変更可能なフィールドを定義する場合などに使います。mutableはヘタに使うと混乱を招くだけの余計な機能なんですが、こんな感じでスレッドセーフなク…

VC++ 2010以降のstd::set::iterator

(これは2011-02-13に書いた故OCNブログの記事を加筆修正したものです)C++11 (C++0x) 対応関連でSTLのstd::set::iteratorの仕様が変わって、VC++ 2010以降ではstd::set::const_iteratorと同じ型になっています。MS Connectへの報告はすでに存在しますが、こ…

boolとgetter/setterの命名

C++の命名規則に関する話です。普通getter/setter(いわゆるアクセッサ)であるようなメソッド名(メンバー関数名)には接頭辞にGet/Setもしくはget/setを付け、その後に内部フィールド名(メンバー変数名)などを続けるような形で命名すると思いますが、boo…

SquirrelスクリプトをWindowsストア アプリで使う

前回LuaスクリプトをWindowsストア アプリで使うという記事を書きましたが、それのSquirrel版です。本体はSquirrel Ver.3.0.6、C++バインダーには2014年現時点で最も完成度が高く導入しやすいと思われるSqrat Ver.0.9を使いました*1。Lua同様Squirrelも若干…

LuaスクリプトをWindowsストア アプリで使う

(これは2013-04-25に書いた故OCNブログの記事を加筆修正したものです)Windows 8上で動作する、Windowsストア アプリでスクリプト言語Lua 5.2とそのC++バインダーであるLuabind 0.9を使う方法です。そもそも公式の Luabind 0.9.1 はLua 5.2.x系列に対応して…

IronPython備忘録

(これは2012-04-21に書いた故OCNブログの記事を移植したものです)しばらく使わないと忘れるので、備忘録ついでにC#との比較を少し載せておきます。 Visual C#プロジェクトの参照設定に相当するコード: import clr clr.AddReferenceByPartialName("System.…

ダウンキャストに潜む罠

(これは2012-05-18に書いた故OCNブログの記事を移植したものです)C++のダウンキャスト(特に多重継承した場合)にまつわるお話です。例えばこんな感じ。 #include <cstdio> #include <conio.h> class Base1 { protected: virtual ~Base1() { puts(__FUNCSIG__); } }; class </conio.h></cstdio>…

C関数のis*系ルーチンの注意点

(これは2012-06-03に書いた故OCNブログの記事を移植したものです)C言語の <ctype.h> もしくはC++の <cctype> におけるisdigit(), isalpha(), isalnum(), isupper(), islower(), isspace(), ...とかの話です。もともとこいつらは引数の型がcharではなくintになっているんです</cctype></ctype.h>…

AFX_EXT_API/AFX_EXT_DATA/AFX_EXT_CLASSの罠

(これは2012-06-05に書いた故OCNブログの記事を移植したものです)Visual C++のMFC拡張DLLを使って名前空間レベルのグローバル関数・グローバル変数やクラスそのものをエクスポートするとき、 extern AFX_EXT_API void MyGlobalFunc(); extern AFX_EXT_DATA…

不定値IND・非数NaNと浮動小数点演算速度

コードの単体パフォーマンステストをやっていて興味深い現象に遭遇しました。 演算途中で発生した不定値 IND (indeterminate value, -1.#IND) や、非数 NaN (not a number, 1.#QNAN) をそのまま計算に使い続けると、環境によっては正常値で演算する場合と比…

同次変換行列

(これは2012-08-04に書いた故OCNブログの記事を移植したものです)MSDNにあるDirect2Dの付録ページに書いてある、2次元の回転の3x3同次変換行列の数式が2012年8月現時点で間違っているので、とりあえず正しいものをC言語構造体っぽい形式で書いておきます。…

C++コンストラクタの初期化子リスト

(これは2010-09-24に書いた故OCNブログの記事を移植したものです)ちょっとしたマイナーテクですが、クラスのメンバー変数をコンストラクタでゼロクリアする際、下記のように書けます。 class SomeClass { struct Vector3 { float x, y, z; }; int m_intVal…

メンバー変数命名規則

(これは2010-10-20に書いた故OCNブログの記事を移植したものです)自分はC++の場合、classメンバー変数の命名規則として、ずっと "m_" プレフィックスを付けるようにしています。 ただし、すべてのメンバーを外部公開するstructメンバー変数(ここでいうstr…

コンピュートシェーダーでGPUパーティクル

DirectX (Direct3D) のコンピュートシェーダー (Compute Shader, DirectCompute) には4バイト(uint)単位で要素アクセスが可能なByteAddressBuffer/RWByteAddressBuffer (BAB) というデータ型があるんですが、DirectXにおいてGPUで頂点バッファの内容を直接…

Visual C++とUTF-8マルチバイト

Visual C++には #pragma execution_character_set("utf-8") というプラグマがあって、これを使うとコンパイル時にマルチバイト文字列リテラル(プレフィックスなしの"XXX")をOSのANSIコードページ文字列リテラル(Shift_JIS:CP932とか)ではなくUTF-8文字列…

map/unordered_mapのキーにカスタムデータ型を使う

C++の標準ライブラリではテーブル(連想配列)系のコンテナとして、ツリー実装のset/map/multiset/multimapが使えます。またC++11規格では、新たにハッシュテーブル実装のunordered_set/unordered_map/unordered_multiset/unordered_multimapが使えるように…

OpenCVの輝度スケーリング

OpenCVで画像ロードしてRGB→YCbCr変換して、特殊なカーネルコードにより輝度YをスケーリングしたのちYCbCr→RGBに戻す、というコードを書いてみました。つまりOpenCVのフィルター系関数や変換マトリックスは使ってません。単純に線形スケーリングするだけなら…

printfとString.Format

(これは2013-06-27に書いた故OCNブログの記事を移植したものです).NETのString.Format()やConsole.Write()/WriteLine()の書式を駆使すれば、ほぼCのprintf系をカバーできるんですが、MSDNの書式指定構文の説明にある、 % [flags] [width] [.precision] [{h…