Shader実験

irrLichtのシェーダー機能を試してみた。
OpenGLDirectXでほとんどの部分を共用にできるので、GLSLとHLSL両方を試してみるには便利だ。irrLichtをマスターするという初期投資は必要になるが。
glslのテクスチャ周りではまった点をメモ。

その1

複数のuniform sampler2Dの渡し方。
uniform変数をシェーダーに渡すのを単一のvideo::IMaterialRendererServices::setVertexShaderConstant
でできるようにしているため、intを一個渡すuniform sampler2Dが逆にすごくわかりにくくなっている。float*にキャストして中で再度int*にキャストしなおすという微妙な状況になっている。

s32 unit[]={0, 1};
services->setVertexShaderConstant("tex0", (f32*)&unit, 1);
services->setVertexShaderConstant("tex1", (f32*)&unit+1, 1);

// COpengLSLMaterialRenderer.cpp内の
// COpenGLSLMaterialRenderer::setPixelShaderConstantのソースを見ると
// 中身が分かる

ちなみに、
setVertexShaderConstantは中でsetPixelShaderConstantを呼んでいるのでどっちもでもいい。また、テクスチャがひとつの時は特にsetPixelShaderConstantを使わなくてもuniform sampler2Dに渡るみたいだ。GLSLで2つ目以降のuniform sampler2Dの時は要るみたい。HLSLでは要らなかった。

その2

uniform sampler1Dの使い方が不明。
とりあえず、
sampler2Dでy軸に0で取ることで誤魔化した。



irrlicht-1.7.1で実験