[DxLib]ポリゴンに描写する画像の透過度がおかしい

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

[DxLib]ポリゴンに描写する画像の透過度がおかしい

#1

投稿記事 by G.G. » 10年前

どうも、毎回お騒がせしています。

DrawPolygonIndexed3D関数で四角いポリゴンを作成し、画像を描写するコードを作りました。
座標や回転角度等は正しく描写されましたが、画像が透けてしまっています。
透過度の設定もできますが、未設定状態(透過しない)でも透けている他、画像の輝度の変更もできていません。

おそらく何か別の関数等を使ったり、Vertexの設定を間違えているのかも知れません。
どこが間違っているのか教えてください。

問題の部分はvoid C_Graph::Draw3Dの部分。Graph.cppの一番下です。

Graph.cpp

コード:

#include "Graph.h"
#include "Debug.h"

//デフォルトカラーのセット
C_Color Default = C_Color(1.0f, 1.0f, 1.0f, 1.0f);

C_Rect::C_Rect(){

	//0で初期化
	x = 0.0f, y = 0.0f;
	w = 0.0f, h = 0.0f;

}

C_Rect::C_Rect(float X,float Y,float W,float H){
	
	x = X, y = Y;
	w = W, h = H;

}

//デフォルト
C_Color::C_Color(){
	
	//透過せず全色情報で表示
	r = 1.0f; g = 1.0f; b = 1.0f; a = 1.0f;

}

//int型からfloat に変換し入力
C_Color::C_Color(int Red, int Green, int Blue, int Alpha){

	r = 255.0f/(float)Red;
	g = 255.0f / (float)Green;
	b = 255.0f / (float)Blue;
	a = 255.0f / (float)Alpha;

}

//フロート型から直接入力
C_Color::C_Color(float Red, float Green, float Blue, float Alpha){

	r = Red; g = Green; b = Blue; a = Alpha;

}

//int型の色情報
int C_Color::Int(){

	int R, G, B;
	R = (int)(255.0f * r);
	G = (int)(255.0f * g);
	B = (int)(255.0f * b);
	return GetColor(R,G,B);

}

//int型の透過情報
int C_Color::Alpha(){

	return (int)(255.0f*a);

}

//COLOR_F型の色情報
COLOR_F C_Color::Float(){

	return GetColorF(r, g, b, a);

}

C_Graph::C_Graph(){

	//画像データハンドルを作成していないとし、-1を入れる
	handle = DX_NONE_GRAPH;
	gw = 0; gh = 0;

}

C_Graph::C_Graph(char pass[256]){

	//指定パスの画像データのハンドルを作成します。
	handle = LoadGraph(pass);
	GetGraphSize(handle, &gw, &gh);

}

C_Graph::~C_Graph(){

	//メモリからグラフィックを削除
	DeleteGraph(handle);

}

void C_Graph::Ini(){

	//-1で初期化します。
	handle = DX_NONE_GRAPH;
	gw = 0; gh = 0;

}

void C_Graph::SetColor(C_Color Color){

	color = Color;

}

//指定座標を左上とし画像を表示する。
void C_Graph::Draw(C_Rect Rect){

	//カラーをセットする
	SetDrawBright((int)(255.0f*color.r),(int)(255.0f*color.g),(int)(255.0f*color.b));
	SetDrawBlendMode(DX_BLENDMODE_ALPHA, color.Alpha());
	//画像を表示
	SetDrawMode(DX_DRAWMODE_BILINEAR);//バイリニアに変更
	DrawExtendGraphF(Rect.x, Rect.y,Rect.x+Rect.w,Rect.y+Rect.h, handle, true);
	SetDrawMode(DX_DRAWMODE_NEAREST);//ネアレストネイバーに変更
	//カラーをデフォルトに戻す
	SetDrawBright((int)(255.0f*Default.r), (int)(255.0f*Default.g), (int)(255.0f*Default.b));
	SetDrawMode(DX_BLENDMODE_NOBLEND);

}

void C_Graph::RotateDraw(C_Rect Rect, float cx, float cy, float angle){
	
	//画像のサイズを得ていないときはこの時点でサイズを得ておく
	if(gw==0||gh == 0)GetGraphSize(handle, &gw, &gh);
	
	//引数の事情で画像の拡大率を算出
	double ew, eh;
	ew = (double)(Rect.w / gw);
	eh = (double)(Rect.h / gh);

	//カラーをセットする
	SetDrawBright((int)(255.0f*color.r), (int)(255.0f*color.g), (int)(255.0f*color.b));
	SetDrawBlendMode(DX_BLENDMODE_ALPHA, color.Alpha());
	//画像表示
	SetDrawMode(DX_DRAWMODE_BILINEAR);//バイリニアに変更
	DrawRotaGraph3F(Rect.x, Rect.y, cx, cy, ew, eh, (double)angle, handle, true);
	SetDrawMode(DX_DRAWMODE_NEAREST);//ネアレストネイバーに変更
	//カラーをデフォルトに戻す
	SetDrawBright((int)(255.0f*Default.r), (int)(255.0f*Default.g), (int)(255.0f*Default.b));
	SetDrawMode(DX_BLENDMODE_NOBLEND);

}

//4点を元に自由表示
void C_Graph::ModiDraw(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4){
	
	//カラーをセットする
	SetDrawBright((int)(255.0f*color.r), (int)(255.0f*color.g), (int)(255.0f*color.b));
	SetDrawBlendMode(DX_BLENDMODE_ALPHA, color.Alpha());
	//画像表示
	SetDrawMode(DX_DRAWMODE_BILINEAR);//バイリニアに変更
	DrawModiGraphF(x1, y1, x2, y2, x3, y3, x4, y4, handle, true);
	SetDrawMode(DX_DRAWMODE_NEAREST);//ネアレストネイバーに変更
	//カラーをデフォルトに戻す
	SetDrawBright((int)(255.0f*Default.r), (int)(255.0f*Default.g), (int)(255.0f*Default.b));
	SetDrawMode(DX_BLENDMODE_NOBLEND);

}

//3D空間上にポリゴンを出す
void C_Graph::Draw3D(VECTOR Position, VECTOR Rotation, C_Rect Size){

	VECTOR L1, L2, R1, R2;//左上、左下、右上、右下
	L1 = VGet(-Size.w/2.0f,-Size.h/2.0f,0.0f);
	L2 = VGet(-Size.w / 2.0f, Size.h / 2.0f, 0.0f);
	R1 = VGet(Size.w / 2.0f, -Size.h / 2.0f, 0.0f);
	R2 = VGet(Size.w / 2.0f, Size.h / 2.0f, 0.0f);

	MATRIX MX, MY, MZ;//各軸の回転行列
	MX = MGetRotX(Rotation.x);
	MY = MGetRotY(Rotation.y);
	MZ = MGetRotZ(Rotation.z);

	MATRIX MALL;//回転まとめ
	MALL = MMult(MX, MY);
	MALL = MMult(MALL, MZ);

	//4点に対し回転行列による回転を行う
	L1 = VTransform(L1, MALL);
	L2 = VTransform(L2, MALL);
	R1 = VTransform(R1, MALL);
	R2 = VTransform(R2, MALL);

	//法線の設定。こちらも回転を行う
	VECTOR Norm = VGet(0.0f, 0.0f, -1.0f);
	Norm = VTransform(Norm, MALL);

	//ヴァーテックスの設定を行う
	VERTEX3D Vertex[4];
	Vertex[0].pos = VAdd(L1,Position);//左上
	Vertex[1].pos = VAdd(L2, Position); //左下
	Vertex[2].pos = VAdd(R1, Position);//右上
	Vertex[3].pos = VAdd(R2, Position); //右下

	//テクスチャ画像(ポリゴンいっぱいに表示)
	Vertex[0].u = 0.0f;
	Vertex[0].v = 1.0f;
	Vertex[1].u = 0.0f;
	Vertex[1].v = 0.0f;
	Vertex[2].u = 1.0f;
	Vertex[2].v = 1.0f;
	Vertex[3].u = 1.0f;
	Vertex[3].v = 0.0f;

	//8bit色情報に変換
	COLOR_U8 color_u8 = GetColorU8((int)(255.0f*color.r), (int)(255.0f*color.g), (int)(255.0f*color.b), (int)(255.0f*color.a));

	//面倒なのでここから一括設定
	for (int i = 0; i < 4; i++){
		Vertex[i].norm = Norm;
		Vertex[i].spc = color_u8;
		Vertex[i].su = 0.0f;
		Vertex[i].sv = 0.0f;
	}

	//ポリゴンの頂点インデックス設定
	WORD Index[6];
	//ポリゴン一つ目>
	Index[0] = 0;//左上
	Index[1] = 1;//左下
	Index[2] = 2;//右上
	//ポリゴン二つ目⊿
	Index[3] = 3;//右下
	Index[4] = 2;//右上
	Index[5] = 1;//左下

	//ポリゴン描写
	DrawPolygonIndexed3D(Vertex, 4, Index, 2, handle, TRUE);

	Debug_log(color_u8.a, 10);

}
Graph.h

コード:

#ifndef GRAPH_H
#define GRAPH_H

#include "DxLib.h"

//グラフィッククラス仕様

/*
グラフィッククラスは指定された設定どおりに画像を表示させるためのクラス。
2Dグラフィックの座標、サイズはRectを引数とします。
ハンドル変数には直接アクセスできません。

補助クラス
C_Rect
座標はサイズを保管ずるためのクラス。移動等はこのクラスを使用する関数内等で行うこと。

C_Color
カラー情報を保管するクラス。GetColorで設定できるのはRGBのみでかつalphaが保存できないので
このクラスに可逆可能な状態で保存する。

*/

//Rect
class C_Rect{
public:
	float x, y, w, h;
	//二次元座標および表示グラフィックのサイズ
public:
	C_Rect();
	C_Rect(float X,float Y,float W,float H);
};

//Color
class C_Color{
public:
	float r, g, b,a;
public:
	C_Color();
	C_Color(int Red, int Green, int Blue, int Alpha);
	C_Color(float Red, float Green, float Blue, float Alpha);
public:
	int Int();//int型の色情報
	int Alpha();//int型の透過情報
	COLOR_F Float();//COLOR_F型の色情報

};

//グラフィッククラス
class C_Graph{
	int handle;//グラフィックハンドル
	int gw, gh;//グラフィックサイズ
	C_Color color;//色情報
public:
	C_Graph();//通常コンストラクタ
	C_Graph(char pass[256]);//グラフィックハンドル設定コンストラクタ
	~C_Graph();//デストラクタ
public:
	void Ini();//初期化
	void SetColor(C_Color Color);//色情報をセットする
	void Draw(C_Rect Rect);//指定座標を左上とし、画像を表示
	void RotateDraw(C_Rect Rect,float cx,float cy, float angle);//指定座標を中心に画像を回転表示させる。
	//RotateDrawはRect.x,yを中心からの距離としている。
	void ModiDraw(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);//4点を元に自由表示
	void Draw3D(VECTOR Position,VECTOR Rotation,C_Rect Size);//3D空間上に画像ポリゴンを表示

};


#endif

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