以前仕事でスキンメッシュ+カトゥーンで描画するDirectXのプログラムを組んだのだけどそれがどうやら一部のPCでバグってるらしく
しかし、いくら手元にある数台のPCでチェックしても再発してくんない。んでもって他の仕事の仲間なんかにも頼んでやってみるも再現せず。
聞くところによると描画がおかしくなってるのですぐわかるってことらしいが、全然正常なのだ。
しょうがないのでバグっているPC丸ごと送ってもらい、VCをインストールしてデバッグ作業したが、ちゃーんとバグってくれている。
カトゥーンレンダリングのエッジの部分がひん曲がっていて、はみ出た立体がエッジじゃなくなってる。
で、いろいろ探ってみるが全然原因がわからない。ところで、このエッジのレンダリング部分は頂点シェーダを使ってる。
ハード自体が対応してないのかと思って、それっぽいサンプルをWEBから拾ってきて改造して同じファイルを読ませるとうまくいくorz
実行時の各種の行列まで比較してみたりするのだけど、まったく同じで原因がさぱーりわからん。
そんなこんなで悩むこと丸1日半。
スキンメッシュ用のボーンとかその他もろもろの情報をSetVertexShaderConstantしてる部分の765.0fを765.01fにしたら直った・・・
私の時間をカエシナサイ・・イヤマジデw
頂点シェーダに渡す頂点情報の中に行列パレットのインデックスがあって、それはインデックスだから普通D3DVSDT_UBYTE4なんだけど
対応してないGeforce3のためにD3DVSDT_D3DCOLORで受け渡ししてるわけ。
で、もともとD3DVSDT_UBYTE4が0〜255なのを無理やりD3DVSDT_D3DCOLORに変換するので255で割られた0〜1のデータに変換されちゃう。
そこで255をかけて「元に戻す」のだけど行列1つにつき3つのインデックス分を使ってるから、3*255で結局内部で765をかける。
しかーし、これが間違いの元でドライバによっては

1 => 3 * 1 / 3 => 3 * 0.333333... => 0.99999

になってインデックスがずれるようだ。。
まぁとくにかく直ってよかったよ。PCおくりかえさねば^^;