Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -カラーリングの問題-

頂点データは三角形であれば,どれだけあっても表示できる事がわかりました
問題は色をどうするか? です

というのも,このサンプルの仕組みでは,頂点データに色情報を入れる必要があります
ところが,インデックスを使用する表示方法の場合,頂点データの順番が滅茶苦茶にされてしまいます
これでは変な色しか出せません(もしくは全部同じ色か)

恐らくシェーダーから書き直す必要がありますが,例のごとくどうすればよいのかがわかりません('-'*)
何がわからないのかがわからない ←


TSXBIN表示されている pmdのマテリアルデータを眺める
。。。。。

5時間後 ←
ねぇ?('-'*)
マテリアルにある face_vert_count全部足したら,インデックスの総数にならない?
電卓を入れてみたら,確かに一致した

つまり,ポリゴン1コずつに色指定がされているのだと予想
だがしかし,インデックスデータにはカラーデータは入れられない(置くような場所が無い)
これを実現しようと思うと,1インデックス出力する度に全頂点データのカラーリングを変更するしかない

いや,まてよ
pmdデータは三角ポリゴン単位で扱われているので……
同一頂点は同じ色になっているはずなので……
予め頂点カラー付けとけばいいんじゃないかな?('-'*)?

やってみた

・pmd.hに材質リスト構造体を追加
~面頂点リストの直後から
//材質リスト
unsigned long material_count;
struct t_material{
float diffuse_color[3];
float alpha;
float specularity;
float specular_color[3];
float mirror_color[3];
unsigned char toon_index;
unsigned char edge_flag;
unsigned long face_vert_count;
char texture_file_name[20];
};
t_material *material;
・pmd.cppに材質リストデータ読み込み
~面頂点リストデータ読み込みの直後から
//材質リスト材質数
fread(&material_count, sizeof(material_count), 1, hFP);

//材質リストデータ読み込み
material = new t_material[material_count];
fread(material, 70, material_count, hFP);
・メインプログラムに頂点データにカラーを当てるのを追加
~インデックスデータを取得の直後から
//カラーデータを取得
int COLORSU = modeldata->material_count;

int cnt_idx = 0; //インデックスカウンター
for(int i=0; i < COLORSU; i++){
//マテリアルにあるカウンター分回す
for(int j=0; j < modeldata->material[i].face_vert_count; j++){
//インデックスから頂点座標の行数を取り出す
int pos_vec = modeldata->face_vert_index[cnt_idx];
cnt_idx++; //インデックスカウンターを進める

//その頂点座標のカラーが現在のマテリアルカラー
hVectorData[pos_vec].col[0] = modeldata->material[i].diffuse_color[0]; //R
hVectorData[pos_vec].col[1] = modeldata->material[i].diffuse_color[1]; //G
hVectorData[pos_vec].col[2] = modeldata->material[i].diffuse_color[2]; //B
hVectorData[pos_vec].col[3] = modeldata->material[i].alpha; //A
}
}

実行してみると,色が付いた(^_^)


角度を変えて見ても,だいたい正しそう


TOPプログラマ専用DirectX11開発