SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
NAN-A
記事: 94
登録日時: 12年前

SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

#1

投稿記事 by NAN-A » 8年前

画面をSetWindowSizeExtendRateにて2倍にした時に
ニアレストネイバー法で拡大したいのですが、SetDrawModeにて設定してもバイリニア法で拡大されてしまいます。

これまではDXライブラリのVer 3.13dを使用していて、そのときは拡大した際は自動的にニアレストネイバー法になっていたのですが、
先日Ver3.15cにバージョンアップしたところ、バイリニア法になっていたので、
SetDrawModeにてニアレストネイバー法にしようと思っていたのですが、DxLib_Init()の前後などにいどうさせても反映されませんでした。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	
	ChangeWindowMode(TRUE);
	SetAlwaysRunFlag( TRUE );

	DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
	
	SetWindowSizeExtendRate( 2.0 ) ;
	SetDrawMode( DX_DRAWMODE_NEAREST );
	
	// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()== 0 ){
		DrawString( 10, 30, "test", GetColor( 255, 255, 255 ) );
	}
        
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
 
ご教授の程よろしくお願い致します。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

#2

投稿記事 by ISLe » 8年前

もともとSetWindowSizeExtendRateで拡縮する際にかかるフィルタは環境に依存するようです。
こちらでは、提示されたコードは、ピクセルがくっきりはっきりニアレストで描画されます(Ver3.15e)。

以下のように、
オフスクリーンに等倍で描画して、
オフスクリーンを表示用画面に拡縮で描画する
ようにすると環境依存しません。

コード:

#include "DxLib.h"
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	SetGraphMode(640*2, 480*2, 32);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;

	int offscreen = MakeScreen(640, 480, FALSE);

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{
		SetDrawScreen(offscreen);
		SetDrawMode( DX_DRAWMODE_NEAREST );
		DrawString( 10, 30, "test", GetColor( 255, 255, 255 ) );

		SetDrawScreen(DX_SCREEN_BACK);
		SetDrawMode( DX_DRAWMODE_NEAREST );
		//SetDrawMode( DX_DRAWMODE_BILINEAR ); // バイリニアを選択する場合はここで
		DrawExtendGraph(0, 0, 640*2, 480*2, offscreen, FALSE);
	}

	DxLib_End();
	return 0;
}

アバター
NAN-A
記事: 94
登録日時: 12年前

Re: SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

#3

投稿記事 by NAN-A » 8年前

ISLe様

返信が遅くなってしまい申し訳ございませんでした。
提示していただいコードにてニアレストネイバー法およびバイリニア法にて描画と切り替えがされることを確認しました。
ここでもう1つ要望がありまして、Aという画像はバイリニアで、Bという画像はニアレストネイバー法で拡大したいとなった場合
提示していただいたコードでは「最終的にどっちの方法で拡大するか」となっているようだったので、
画像事や「ソース上、ここからここはニアレストネイバー法で」のような個別には対応が出来る方法はない感じでしょうか?

具体的にはドット絵のゲームでユーザーにウインドウのサイズを切り替えられるようにして、
2倍拡大になったときにドット絵はニアレストネイバー法で、UIなどはバイリニア法にしたいということです。

重ね重ねになりますが、解決法がありましたら教えていただければと思います。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

#4

投稿記事 by ISLe » 8年前

NAN-A さんが書きました:具体的にはドット絵のゲームでユーザーにウインドウのサイズを切り替えられるようにして、
2倍拡大になったときにドット絵はニアレストネイバー法で、UIなどはバイリニア法にしたいということです。
オフスクリーンをアルファチャンネル付きで、
>オフスクリーンに等倍で描画して、
>オフスクリーンを表示用画面に拡縮で描画する
を必要なだけ繰り返せばできます。

あとから描画したほうが手前(上)に表示されます。
アルファチャンネル付きオフスクリーンをバイリニアで描画するとき乗算済みアルファブレンドモードで描画する必要があります。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	SetGraphMode(640*2, 480*2, 32);
	ChangeWindowMode(TRUE);
	if (DxLib_Init() != 0) return 0;

	int offscreen = MakeScreen(640, 480, TRUE); // アルファチャンネル付き

	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0)
	{
		SetDrawScreen(DX_SCREEN_BACK);
		DrawBox(0, 0, 640, 480*2, GetColor(255,0,0), TRUE);
		DrawBox(640, 0, 640*2, 480*2, GetColor(0,0,255), TRUE);

		SetDrawScreen(offscreen);
		ClearDrawScreen(); // 繰り返し使うのでオフスクリーンをクリア
		SetDrawMode( DX_DRAWMODE_NEAREST ); // オフスクリーンにはリアレスト
		DrawString( 10, 30, "dot", GetColor( 255, 255, 255 ) );
		DrawString( 10+320, 30, "dot", GetColor( 255, 255, 255 ) );

		SetDrawScreen(DX_SCREEN_BACK);
		SetDrawMode( DX_DRAWMODE_NEAREST ); // ニアレストで拡大
		DrawExtendGraph(0, 0, 640*2, 480*2, offscreen, TRUE); // 透過付き描画

		SetDrawScreen(offscreen);
		ClearDrawScreen(); // 繰り返し使うのでオフスクリーンをクリア
		SetDrawMode( DX_DRAWMODE_NEAREST ); // オフスクリーンにはリアレスト
		DrawString( 20, 40, "UI", GetColor( 0, 0, 255 ) ); // 重なり具合に注目
		DrawString( 20, 60, "UI", GetColor( 255, 255, 255 ) ); // 重なり具合に注目
		DrawString( 20+320, 40, "UI", GetColor( 255, 0, 0 ) ); // 背景とのアンチエイリアス具合に注目
		DrawString( 20+320, 60, "UI", GetColor( 255, 255, 255 ) ); // 背景とのアンチエイリアス具合に注目

		SetDrawScreen(DX_SCREEN_BACK);
		SetDrawMode( DX_DRAWMODE_BILINEAR ); // バイリニアで拡大
		SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA, 255); // 乗算済みアルファブレンド
		DrawExtendGraph(0, 0, 640*2, 480*2, offscreen, TRUE); // 透過付き描画
		SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 255); // 戻す
	}

	DxLib_End();
	return 0;
}

アバター
NAN-A
記事: 94
登録日時: 12年前

Re: SetDrawMode( DX_DRAWMODE_NEAREST );が機能しない

#5

投稿記事 by NAN-A » 8年前

ISLe様

返信遅れてしまい申し訳ございませんでした。

なるほど、切り替えるたびに描画をしなおすという感じなのですね。
ありがとうございます!早速活用させていただきます!

閉鎖

“C言語何でも質問掲示板” へ戻る