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

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

プログラミングTips

C++のmutableの使い道

(これは2010-10-20に書いた故OCNブログの記事を加筆修正したものです)C++のmutableはconstメソッド(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への報告はすでに存在しますが、こ…

GLSLが使いにくい件について

(これは2011-09-20に書いた故OCNブログの記事を加筆修正したものです)個人的にグラフィックス プログラミングが好きで、仕事でも趣味でもDirectXやOpenGLを使っているんですが、OpenGL/OpenGL ESの不甲斐なさにそろそろ愛想が尽きてきました。 具体的にDir…

コンピュートシェーダーの性能

(これは2011-10-08に書いた故OCNブログの記事を加筆修正したものです)DirectX 9世代のシェーダーモデル3.0までは、画面座標系でのポスト エフェクト処理(たとえばガウスぼかしやブルーム、トーン マッピング、SSAOなど)はレンダーターゲットを切り替えて…

boolとgetter/setterの命名規則

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

HTMLヘルプ作成でハマったこと

(これは2012-02-05に書いた故OCNブログの記事を移植したものです)Visual StudioのMFCアプリケーション プロジェクト ウィザードで、「高度な機能」の「コンテキスト ヘルプ(HTML)」ってのにチェックを入れておくと、HTMLヘルプ(コンパイル済みヘルプ、C…

WPFのAero2/AeroLiteテーマ

以前書いたModern UI for WPFの導入に関する記事にて、WPF 4.5におけるAero2/AeroLiteテーマの外観上の問題点について言及しましたが、具体的にどういうことなのか説明しましょう。 まずはサンプルコードから。 WpfAero2ThemeTest1.zip 以下はWindows 7での…

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ストア アプリ(WinRTアプリ)でスクリプト言語Lua 5.2とそのC++バインダーであるLuabind 0.9を使う方法です。そもそも公式の Luabind 0.9.1 はLua 5.2.…

WPFアプリの外観をストア アプリ風に ―Modern UI for WPF―

(これは2013-05-13に書いた故OCNブログの記事を加筆修正したものです)Windowsストア アプリ(Windowsランタイム アプリ、WinRTアプリ)や、Outlook.com、OneDrive(旧SkyDrive)などで採用されている、Modern UI(旧称Metro UI)は、他のMS製デスクトップ …

Win32/MFCとWinForms/WPF相互運用

(これは2012-06-14に書いた故OCNブログの記事を移植したものです)以前からWin32/MFCとWPFの相互運用性(主にWPF 3.5 *1)に関して独自調査を続けているんですが、メッセージまわりでやはり問題がいくつか発生することが判明してきています。基本的にはWin3…

ダウンキャストに潜む罠

(これは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>…

WPFレイヤードウィンドウのヒットテストを無効化

(これは2012-08-24に書いた故OCNブログの記事を移植したものです)WPFでレイヤード ウィンドウを作る場合、 WindowStyle="None" Background="Transparent" AllowsTransparency="True" のように設定するだけで簡単に実現できます。ピクセル単位のアルファ透…

AFX_EXT_API/AFX_EXT_DATA/AFX_EXT_CLASSの罠

(これは2012-06-05に書いた故OCNブログの記事を移植したものです)Visual C++のMFC拡張DLLを使って名前空間レベルのグローバル関数・グローバル変数やクラスそのものをエクスポートするとき、以下のような感じでマクロを使って宣言部を修飾してやれば簡単に…

XAMLルート要素のプロパティのローカライズ

(これは2012-06-19に書いた故OCNブログの記事を移植したものです)コレ、結構悩んだんですが、WPFにおいてWindowとかUserControlとかPageとかのルート要素のフォントなどをローカライズするためにリソース文字列を指定するには、(Attribute Syntaxは使わず…

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

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

2次元の同次変換行列

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

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

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

メンバー変数命名規則

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

Android SDKエミュレータでOpenGL ES 2.0

(これは2013-06-01に書いた故OCNブログの記事を移植したものです)仕事で少しだけ Android(主に OpenGL まわり)に携わることになったんですが、OpenGL ES 2.0 開発環境を構築するのに少々手間取ったのでメモを残しておきます。最終的には PC 上で OpenGL …

Windows言語設定の取得API

(これは2013-05-17に書いた故OCNブログの記事を移植したものです) Windowsで各種言語設定を取得するとき、いくつかのよく似たWin32 APIがあるんですが、それぞれ微妙に結果が異なるので注意が必要です。代表的なのは下記の6つ。 LANGID GetSystemDefaultLa…

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

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

HLSLの行列乗算がmul()関数な理由

GLSLでは行列の乗算に*演算子を使います。 // GLSL mat4 mTransformA; mat4 mTransformB; vec4 vIn; vec4 vOut = mTransformB * mTransformA * vIn; 一方HLSLではmul()関数を使います。 // HLSL float4x4 mTransformA; float4x4 mTransformB; float4 vIn; fl…

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

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

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

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

BGRA/RGBAに関してそろそろ一言いっておくか

世には4つのカラーチャンネル(Red, Green, Blue, Alpha)をサポートする画像フォーマットは数多あるのですが、整理も兼ねて Direct3D や OpenGL のテクスチャ フォーマットとの関連に言及しながらまとめてみようと思います。早速ですがいきなりサンプルコー…

CUDAでテクスチャ

前回の記事では CUDA の線形メモリ(Linear Memory, cudaMalloc() で生成)を使って FP16 浮動小数点数値を格納しました。 今回は CUDA の Array と Texture を使って、0x0000 ~ 0xFFFF の範囲の 16bit 整数値(ushort)を正規化して 0.0 ~ 1.0 の範囲の 32b…

CUDAでhalf型

VRAM 使用量や帯域の節約目的で、CUDA や OpenCL のカーネルに FP16 半精度浮動小数点数(half)型のデータを渡す場合の話です。 通例 GPGPU で使われる実数は FP32 単精度浮動小数点数(float)型なんですが、half だとその半分のデータ量で済むため、帯域…

OpenCVの輝度スケーリング

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