|
ワイヤーフレームによる、竹ひご立方体の表現が出来たので、 次は、その竹ひごの面を塗ってみたいと思います。 世間一般では、この面を塗る技術をポリゴンと呼んでいるそうな。 んで、面を塗るにはどうしたらいいかというと 「最大-最小法」というアルゴリズムを使います。 これはブレゼンハムアルゴリズムで線を引きながら、ポリゴンバッファに情報を書きこんでいくやりかたで実現できます。 ポリゴンバッファは struct polyBuf{ short min;//最小値 short max;//最大値 }; こんな構造体で定義されており、これを struct polyBuf polyBuf[480]; Y座標の解像度分用意しておきます。 ![]() 後は図のようにして、三角形の頂点を結ぶ時に、 Y座標の1ラインごとにX座標値とポリゴンバッファの値を比較して 最小値より小さい場合や最大値より大きい場合にバッファを更新して値を書きこんでいきます。 そして得られた情報を元に、後は最小値と最大値の間を水平ラインで塗りつぶすのをYの解像度回繰り返せば、面が塗れます。
--------------------------------------------------------
//ポリゴンバッファをクリア
resetpolyBuf();
//三角形を描きながらポリゴンバッファに値を書きこむ
Line(shape.vertex[shape.men[i].index[0]].sx + XORIGIN,
shape.vertex[shape.men[i].index[0]].sy + YORIGIN,
shape.vertex[shape.men[i].index[1]].sx + XORIGIN,
shape.vertex[shape.men[i].index[1]].sy + YORIGIN,
ddsd,
lpVideoMemory
);
Line(shape.vertex[shape.men[i].index[1]].sx + XORIGIN,
shape.vertex[shape.men[i].index[1]].sy + YORIGIN,
shape.vertex[shape.men[i].index[2]].sx + XORIGIN,
shape.vertex[shape.men[i].index[2]].sy + YORIGIN,
ddsd,
lpVideoMemory
);
Line(shape.vertex[shape.men[i].index[2]].sx + XORIGIN,
shape.vertex[shape.men[i].index[2]].sy + YORIGIN,
shape.vertex[shape.men[i].index[0]].sx + XORIGIN,
shape.vertex[shape.men[i].index[0]].sy + YORIGIN,
ddsd,
lpVideoMemory
);
//ポリゴンバッファの値を元に、ポリゴンを塗る
for(int y=0; y<480; y++){
if((polyBuf[y].min != 32767) && (polyBuf[y].max != -32768)){
for(int x=polyBuf[y].min; x<polyBuf[y].max; x++){
lpVideoMemory[ddsd.lPitch * y + x] =shape.men[i].R;
}
}
}
![]() ↑実行画面 ぐっと色気が出たでしょ(^^ 時々、面の前後ろが逆さまになります。 これは次回の陰面消去で解決します。 poly_cube.zip[32kb] |