お世話になっております。
下記のソースコードのようにアンチエイリアス用のスクリーンを作成し、3D空間に画像を描画したところ、アンチエイリアスの効果を確認できませんでした。
画像に対してはアンチエイリアスは対応していないということでしょうか?解決策などありましたらよろしくおねがいします。
<スペック>
win 10 pro
i5 6500
gtx 1060
DXライブラリ 3.19
<ソースコード>
//3D空間に描画する画像
typedef struct {
VECTOR pos[4];
int img, flag;
float u, v, r, b, g, a;
VERTEX_3D vertex[6];
}graph3D_t;
//3D空間への画像描画
void DrawGraph3D(graph3D_t *graph3D) {
//4点座標をvertex配列に格納する
graph3D->vertex[0].pos = graph3D->pos[0]; graph3D->vertex[1].pos = graph3D->pos[1];
graph3D->vertex[0].u = 0.0f; graph3D->vertex[1].u = graph3D->u;
graph3D->vertex[0].v = 0.0f; graph3D->vertex[1].v = 0.0f;
graph3D->vertex[2].pos = graph3D->pos[3]; graph3D->vertex[3].pos = graph3D->pos[2];
graph3D->vertex[2].u = 0.0f; graph3D->vertex[3].u = graph3D->u;
graph3D->vertex[2].v = graph3D->v; graph3D->vertex[3].v = graph3D->v;
graph3D->vertex[4].pos = graph3D->pos[3]; graph3D->vertex[5].pos = graph3D->pos[1];
graph3D->vertex[4].u = 0.0f; graph3D->vertex[5].u = graph3D->u;
graph3D->vertex[4].v = graph3D->v; graph3D->vertex[5].v = 0.0;
//赤色情報を格納
graph3D->vertex[0].r = graph3D->vertex[1].r = graph3D->vertex[2].r =
graph3D->vertex[3].r = graph3D->vertex[4].r = graph3D->vertex[5].r =
(char)(graph3D->r <= 0.0f ? 0.0f : (graph3D->r >= 255.0f ? 255.0f : graph3D->r));
//緑色情報を格納
graph3D->vertex[0].g = graph3D->vertex[1].g = graph3D->vertex[2].g =
graph3D->vertex[3].g = graph3D->vertex[4].g = graph3D->vertex[5].g =
(char)(graph3D->g <= 0.0f ? 0.0f : (graph3D->g >= 255.0f ? 255.0f : graph3D->g));
//青色情報を格納
graph3D->vertex[0].b = graph3D->vertex[1].b = graph3D->vertex[2].b =
graph3D->vertex[3].b = graph3D->vertex[4].b = graph3D->vertex[5].b =
(char)(graph3D->b <= 0.0f ? 0.0f : (graph3D->b >= 255.0f ? 255.0f : graph3D->b));
//不透明度情報を格納
graph3D->vertex[0].a = graph3D->vertex[1].a = graph3D->vertex[2].a =
graph3D->vertex[3].a = graph3D->vertex[4].a = graph3D->vertex[5].a =
(char)(graph3D->a <= 0.0f ? 0.0f : (graph3D->a >= 255.0f ? 255.0f : graph3D->a));
//3D空間への描画
DrawPolygon3D(graph3D->vertex, 2, graph3D->img, TRUE);
}
/*ループで必ず行う処理*/
int ProcessLoop() {
//プロセス処理がエラーなら-1を返す
if (ProcessMessage() != 0)return -1;
//画面クリア処理がエラーなら-1を返す
if (ClearDrawScreen() != 0)return -1;
return 0;
}
int main() {
//解像度の設定
SetGraphMode(1920, 1080, 32);
//ウィンドウモードの設定
ChangeWindowMode(1);
//描画先を裏画面に変更
SetDrawScreen(DX_SCREEN_BACK);
//Direct11を使用
SetUseDirect3DVersion(DX_DIRECT3D_11);
//DXライブラリを初期化(失敗時は終了)
if (DxLib_Init() == -1) return -1;
//アンチエイリアス用のスクリーンハンドル
int A_screen_handle;
//アンチエイリアス用スクリーンの作成
SetCreateDrawValidGraphMultiSample(4, 4);
A_screen_handle = MakeScreen(1920, 1080, TRUE);
SetCreateDrawValidGraphMultiSample(0, 0);
//画像の読み込みと座標(適当)の設定
graph3D_t a;
a.pos[0] = VGet(100, 300, 1000); a.pos[1] = VGet(500, 300, 1000);
a.pos[2] = VGet(500, 0, 200); a.pos[3] = VGet(100, 0, 200);
a.u = 1.0f; a.v = 1.0f;
a.r = 255.0f; a.g = 255.0f; a.b = 255.0f; a.a = 255.0f;
a.img = LoadGraph("./img.png");
//メインループ
while (ProcessLoop() == 0) {
//描画先の変更
SetDrawScreen(A_screen_handle);
//画像を描画
DrawGraph3D(&a);
//描画先の変更
SetDrawScreen(DX_SCREEN_BACK);
//アンチエイリアス用のスクリーンを描画
DrawGraph(0, 0, A_screen_handle, TRUE);
/*裏画面の情報をディスプレイに表示する*/
ScreenFlip();
}
// DXライブラリ使用の終了処理
DxLib_End();
// ソフトの終了
return 0;
}