ポリゴンを使用した画像の描画について

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

ポリゴンを使用した画像の描画について

#1

投稿記事 by 夢猫。 » 9年前

はじめまして。

ポリゴンでのグラフィックの表示について質問させていただきます。
ゲームの背景に立体背景を使いたいと思い、DrawPolygon3Dの三角形ポリゴンを使用して描画を行っています。
同じ画像の敷き詰めに成功しスクロールにも成功しているのですが、なぜか画像がモノクロで表示されてしまいます。
画像のフェードインとフェードアウトには成功しているのでアルファ成分は反映されているのだと思います。
描画部分のソースコードは以下の通りです。

コード:

#include "../resource/dxlib/DxLib.h"
#include <stdio.h>
#include <math.h>
#include "../header/stage3.h"

#define PI 3.141592
#define STT_MAX 21
#define STT_NUM_MAX 20

typedef struct{
	float x,y;
	float u,v;
}stp_t;
stp_t stp[6]={{-1,1,0,0},{1,1,1,0},{-1,-1,0,1},{1,-1,1,1},{-1,-1,0,1},{1,1,1,0}};

typedef struct{
	float x,y,z;
	VERTEX3D sttcs[6];
}sttc_t;

typedef struct{
	int Img;
	int Imgsi;
	int Imgx1;
	int Imgy1;
	int Imgx2;
	int Imgy2;
	int Type;
	int sidlo;
	float six,siy;
	float grx,gry;
	float fromz,toz;
	float fadfromz,fadtoz;
	float zhaba;
	int sttmax;
	int resetf;
	sttc_t srtc[STT_MAX];
}stt_t;
int sttnum;
stt_t stt[STT_NUM_MAX];
void st3ini(){
	if(stinif==0){
	stt[0].Img=LoadGraph("../東方海恩塔/resource/graph/stageback/stage3/water.png");
	stt[0].Imgsi=256;
	stt[0].Imgx1=0;
	stt[0].Imgx2=256;
	stt[0].Imgy1=0;
	stt[0].Imgy2=256;
	stt[0].six=100;
	stt[0].siy=100;
	stt[0].fromz=1500;
	stt[0].fadfromz=1000;
	stt[0].fadtoz=-450;
	stt[0].toz=-500;
	stt[0].zhaba=stt[0].siy;
	stt[0].Type=1;
	stt[0].sidlo=5;
	stt[0].resetf=0;
	sttnum++;
	stinif=1;
	for(int i=0;i<20;i++){
		float ou1 = (float)stt[i].Imgx1 / stt[i].Imgsi, ou2 = (float)(stt[i].Imgx2 -stt[i].Imgx1) / stt[i].Imgsi;
		float ov1 = (float)stt[i].Imgy1 / stt[i].Imgsi, ov2 = (float)(stt[i].Imgy2 -stt[i].Imgy1) / stt[i].Imgsi;
		switch(stt[i].Type){
		case 0:
			break;
		case 1:
			for(int t=0;stt[i].fromz+stt[i].zhaba-t*stt[i].zhaba>stt[i].toz;t++){
				for(int s=0;s<stt[i].sidlo;s++){
				stt[i].srtc[stt[i].sidlo*t+s].x=stt[i].six*s;
				stt[i].srtc[stt[i].sidlo*t+s].y=0/*stt[i].fromz+stt[i].siy-t*stt[i].siy*/;
				stt[i].srtc[stt[i].sidlo*t+s].z=stt[i].fromz+stt[i].zhaba-stt[i].zhaba*t;
				for(int l=0;l<6;l++){
				stt[i].srtc[stt[i].sidlo*t+s].sttcs[l].u=ou1+ou2*stp[l].u;
				stt[i].srtc[stt[i].sidlo*t+s].sttcs[l].v=ov1+ov2*stp[l].v;
				stt[i].srtc[stt[i].sidlo*t+s].sttcs[l].dif=GetColorU8(255,255,255,255);
				}
				}
			}
			break;
		}
	}
	}
}
void stback(){
	for(int t=0;t<sttnum;t++){
		for(int s=0;stt[t].fromz+stt[t].zhaba-s*stt[t].zhaba>stt[t].toz;s++){
		for(int l=0;l<stt[t].sidlo;l++){
			stt[t].srtc[stt[t].sidlo*s+l].z-=20;
			for(int i=0;i<6;i++){
				stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].pos.x=stt[t].srtc[stt[t].sidlo*s+l].x+stt[t].six/2*stp[i].x+50;
				stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].pos.y=stt[t].srtc[stt[t].sidlo*s+l].y/*+stwat.siy*stp[i].y*/;
				stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].pos.z=stt[t].srtc[stt[t].sidlo*s+l].z+stt[t].zhaba/2*stp[i].y;
			}
		}
	}
		for(int s=0;stt[t].fromz+stt[t].zhaba-s*stt[t].zhaba>stt[t].toz;s++){
		for(int l=0;l<stt[t].sidlo;l++){
		for(int i=0;i<6;i++){
			backwatcz=stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].pos.z;
			if(backwatcz<stt[t].toz){
			stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].dif=GetColorU8(255,255,255,0);
			}
			else if(stt[t].toz<backwatcz && backwatcz<=stt[t].fadtoz){
			stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].dif=GetColorU8(255,255,255,(unsigned char)(255.0f/(stt[t].fadtoz-stt[t].toz)*(backwatcz-stt[t].toz)));
			}
			else if(stt[t].fadtoz<backwatcz && backwatcz<=stt[t].fadfromz){
			stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].dif=GetColorU8(255,255,255,255);
			}
			else if(stt[t].fadfromz<backwatcz && backwatcz<=stt[t].fromz){
			stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].dif=GetColorU8(255,255,255,(unsigned char)(255.0f/(stt[t].fromz-stt[t].fadfromz)*(stt[t].fromz-backwatcz)));
			}
			else if(backwatcz<stt[t].fromz){
			stt[t].srtc[stt[t].sidlo*s+l].sttcs[i].dif=GetColorU8(255,255,255,0);
			}
		}
		if(stt[t].srtc[stt[t].sidlo*s+l].z<stt[t].toz-stt[t].zhaba*0.5f){
			float sub=(stt[t].toz-stt[t].zhaba*0.5f)-stt[t].srtc[stt[t].sidlo*s+l].z;
			stt[t].srtc[stt[t].sidlo*s+l].z=stt[t].fromz+stt[t].zhaba*0.5f-sub;
		}
		if(stt[t].srtc[stt[t].sidlo*s+l].z>stt[t].fromz+stt[t].zhaba*0.5f){
			float sub=stt[t].srtc[stt[t].sidlo*s+l].z-(stt[t].fromz+stt[t].zhaba*0.5f);
			stt[t].srtc[stt[t].sidlo*s+l].z=stt[t].toz-stt[t].zhaba*0.5f+sub;
		}
		}
	}
}
	SetDrawMode( DX_DRAWMODE_BILINEAR );
	for(int t=0;t<sttnum;t++){
	for(int s=0;stt[t].fromz+stt[t].zhaba-s*stt[t].zhaba>stt[t].toz;s++){
		for(int l=0;l<stt[t].sidlo;l++){
		DrawPolygon3D(stt[t].srtc[stt[t].sidlo*s+l].sttcs,2,stt[t].Img,TRUE);
		}
	}
	}

	VERTEX3D Vertex[ 6 ] ;
	Vertex[ 0 ].pos  = VGet( 100.0f, 100.0f,  0.0f ) ;
    Vertex[ 0 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 0 ].dif  = GetColorU8( 255,255,255,255 ) ;
    Vertex[ 0 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 0 ].u    = 0.0f ;
    Vertex[ 0 ].v    = 0.0f ;
    Vertex[ 0 ].su   = 0.0f ;
    Vertex[ 0 ].sv   = 0.0f ;

    Vertex[ 1 ].pos  = VGet( 200.0f, 100.0f,  0.0f ) ;
    Vertex[ 1 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 1 ].dif  = GetColorU8( 255,  255,255,255 ) ;
    Vertex[ 1 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 1 ].u    = 1.0f ;
    Vertex[ 1 ].v    = 0.0f ;
    Vertex[ 1 ].su   = 0.0f ;
    Vertex[ 1 ].sv   = 0.0f ;

    Vertex[ 2 ].pos  = VGet( 100.0f, 200.0f,  0.0f ) ;
    Vertex[ 2 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 2 ].dif  = GetColorU8(   255,255,255,255 ) ;
    Vertex[ 2 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 2 ].u    = 0.0f ;
    Vertex[ 2 ].v    = 1.0f ;
    Vertex[ 2 ].su   = 0.0f ;
    Vertex[ 2 ].sv   = 0.0f ;


    Vertex[ 3 ].pos  = VGet( 100.0f, 200.0f,  0.0f ) ;
    Vertex[ 3 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 3 ].dif  = GetColorU8(   255,255,255,255 ) ;
    Vertex[ 3 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 3 ].u    = 0.0f ;
    Vertex[ 3 ].v    = 1.0f ;
    Vertex[ 3 ].su   = 0.0f ;
    Vertex[ 3 ].sv   = 0.0f ;

    Vertex[ 4 ].pos  = VGet( 200.0f, 100.0f,  0.0f ) ;
    Vertex[ 4 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 4 ].dif  = GetColorU8( 255,255,255,255 ) ;
    Vertex[ 4 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 4 ].u    = 1.0f ;
    Vertex[ 4 ].v    = 0.0f ;
    Vertex[ 4 ].su   = 0.0f ;
    Vertex[ 4 ].sv   = 0.0f ;

    Vertex[ 5 ].pos  = VGet( 200.0f,  200.0f,  0.0f ) ;
    Vertex[ 5 ].norm = VGet(   0.0f,   0.0f, -1.0f ) ;
    Vertex[ 5 ].dif  = GetColorU8( 255,255,255,255 ) ;
    Vertex[ 5 ].spc  = GetColorU8(   0,  0,  0,  0 ) ;
    Vertex[ 5 ].u    = 1.0f ;
    Vertex[ 5 ].v    = 1.0f ;
    Vertex[ 5 ].su   = 0.0f ;
    Vertex[ 5 ].sv   = 0.0f ;

	DrawPolygon3D(Vertex,2,stt[0].Img,TRUE);

	DrawFormatString(400,240,GetColor(1,1,1),"[0] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[0].dif.r,stt[0].srtc[0].sttcs[0].dif.b,stt[0].srtc[0].sttcs[0].dif.g,stt[0].srtc[0].sttcs[0].dif.a);
	DrawFormatString(400,270,GetColor(1,1,1),"[1] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[1].dif.r,stt[0].srtc[0].sttcs[1].dif.b,stt[0].srtc[0].sttcs[1].dif.g,stt[0].srtc[0].sttcs[1].dif.a);
	DrawFormatString(400,300,GetColor(1,1,1),"[2] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[2].dif.r,stt[0].srtc[0].sttcs[2].dif.b,stt[0].srtc[0].sttcs[2].dif.g,stt[0].srtc[0].sttcs[2].dif.a);
	DrawFormatString(400,330,GetColor(1,1,1),"[3] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[3].dif.r,stt[0].srtc[0].sttcs[3].dif.b,stt[0].srtc[0].sttcs[3].dif.g,stt[0].srtc[0].sttcs[3].dif.a);
	DrawFormatString(400,360,GetColor(1,1,1),"[4] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[4].dif.r,stt[0].srtc[0].sttcs[4].dif.b,stt[0].srtc[0].sttcs[4].dif.g,stt[0].srtc[0].sttcs[4].dif.a);
	DrawFormatString(400,390,GetColor(1,1,1),"[5] %.d %.d %.d %.d",stt[0].srtc[0].sttcs[5].dif.r,stt[0].srtc[0].sttcs[5].dif.b,stt[0].srtc[0].sttcs[5].dif.g,stt[0].srtc[0].sttcs[5].dif.a);
}
137行目から193行目までのポリゴンは問題が発生した後に試しに単体のみでの表示を試したもので、こちらの方は色が正しい状態での表示を確認しました。
ソースコードの間違いなどのご指摘お願いします。

夢猫。
記事: 28
登録日時: 9年前

ポリゴンを使用した画像の描画について:追記

#2

投稿記事 by 夢猫。 » 9年前

色々試したところ、モノクロという表現は間違いだったようです。
画像を変えたりと色々行ってみましたが透過色の設定をFALSE(反映しない)にしたり透過色のない画像にすると、真っ黒になってしまいました。
なのでおそらくアルファ以外の三色がまったく反映されていないのだと思います。

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

Re: ポリゴンを使用した画像の描画について

#3

投稿記事 by ISLe » 9年前

勘ですけど、VERTEX3Dのnormメンバ(法線)が設定されてないのが原因では?

夢猫。
記事: 28
登録日時: 9年前

Re: ポリゴンを使用した画像の描画について

#4

投稿記事 by 夢猫。 » 9年前

有難う御座います。
言われたとおりにnormメンバの設定を行ったらちゃんと色付きで描画されました!

閉鎖

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