トップページ > 記事閲覧
アンチエイリアスについて
名前:ural1229 日時: 2018/03/12 15:52

お世話になっております。 下記のソースコードのようにアンチエイリアス用のスクリーンを作成し、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; }
メンテ

Page: 1 |

Re: アンチエイリアスについて ( No.1 )
名前:管理人 日時:2018/03/13 01:40

はい、DXライブラリが使用しているアンチエイリアスの方式( MSAA )は、主に描画するポリゴンの縁の部分の ジャギを抑制するためのものなので、ポリゴンの内側に描画される画像の荒さを滑らかにするような効果はありません テクスチャフィルタリングのアルゴリズムを初期状態の『最近点サンプリング方式』から『バイリニア方式』にすることで 画像の表示が滑らかになりますので、よろしければ DrawPolygon3D の前に SetDrawMode( DX_DRAWMODE_BILINEAR ); という記述を増やしてみてください m(_ _)m
メンテ
Re: アンチエイリアスについて ( No.2 )
名前:ural1229(解決) 日時:2018/03/14 20:29

ご回答ありがというございます! どうやらGPUの設定のせいでもあったみたいですが、教えていただいたことも参考にさせていただきます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存