管理人さんへ
早速の返信ありがとうございます。
自分なりに書いてみたクラスは以下のようになりました。
全てうまく行きましたのでとてもうれしいです。ありがとうございました。
class Graph{
private:
int FPS;
int Left[480];//for FlatShading
int Right[480];
int GLeft[480];//for Gouraud Shading
int GRight[480];
int LeftR[480];
int ...RightLeftRandGandB//ここは自明だと思われるので
int Screen;
int grhandle;
int WIDTH,HEIGHT;
int *Image;
public:
void JisakuGouraudPolygon(int handle,int x[3],int y[3],int R1,int G1,int B1,int R2,int G2,int B2,
int R3,int G3,int B3)
{
int y2;
for(y2=0;y2<480;y2++)
{
GLeft[y2]=640;
GRight[y2]=0;
LeftR[y2]=0;
LeftG[y2]=0;
LeftB[y2]=0;
RightR[y2]=0;
RightG[y2]=0;
RightB[y2]=0;
}
JisakuGLine(x[0],y[0],x[1],y[1],R1,G1,B1,R2,G2,B2);
JisakuGLine(x[1],y[1],x[2],y[2],R2,G2,B2,R3,G3,B3);
JisakuGLine(x[2],y[2],x[0],y[0],R3,G3,B3,R1,G1,B1);
for(y2=0;y2<480;y2++)
{
if(GLeft[y2]==640 || GRight[y2]==0)
continue;
JisakuGLine(GLeft[y2],y2,GRight[y2],y2+1,LeftR[y2],LeftG[y2],LeftB[y2],RightR[y2],RightG[y2],RightB[y2]);
}
}
void JisakuPolygon(int x[3],int y[3],int col)
{
for(int y2=0;y2<480;y2++)
{
Left[y2]=65816;
Right[y2]=-65816;
}
JisakuLine(x[0],y[0],x[1],y[1],col);
JisakuLine(x[1],y[1],x[2],y[2],col);
JisakuLine(x[2],y[2],x[0],y[0],col);
for(int y2=0;y2<480;y2++)
{
if(Left[y2]==65816 || Right[y2]==-65816)
continue;
JisakuLine(Left[y2],y2,Right[y2],y2,col);
}
}
void JisakuGLine(int x1,int y1,int x2,int y2,int R1,int G1,int B1,int R2,int G2,int B2,int SW=0)
{
for(int i=0;i<512;i++)
{
int x=(x1*(512-i)+x2*i)/512;
int y=(y1*(512-i)+y2*i)/512;
int R=(R1*(512-i)+R2*i)/512;
int G=(G1*(512-i)+G2*i)/512;
int B=(B1*(512-i)+B2*i)/512;
if(GRight[y]<x)
{
GRight[y]=x;
RightR[y]=R;
RightG[y]=G;
RightB[y]=B;
}
if(GLeft[y]>x)
{
GLeft[y]=x;
LeftR[y]=R;
LeftG[y]=G;
LeftB[y]=B;
}
//PSET(x,y,RGB(R,G,B));
DrawCPUImage(x,y,R,G,B,255);
}
}
void JisakuLine(int x1,int y1,int x2,int y2,int Col,int SW=0)
{
for(int i=0;i<512;i++)
{
int x=(x1*(512-i)+x2*i)/512;
int y=(y1*(512-i)+y2*i)/512;
if(Right[y]<x)
Right[y]=x;
if(Left[y]>x)
Left[y]=x;
//PSET(x,y,Col);
DrawCPUImage(x,y,255,0,0,255);
}
}
void Clear()
{
// ソフトイメージをクリア( R=0 G=0 B=0 A=0 で塗りつぶし )
FillSoftImage( Screen, 0, 0, 0, 0 ) ;
}
void MakeCPUImage(int W,int H)
{
// 640x480 のサイズのソフトイメージを作成
Screen = MakeARGB8ColorSoftImage( 640, 480 ) ;
}
void DrawCPUImage(int x,int y,int R,int G,int B,int alpha)
{
// ソフトイメージの1ライン辺りのバイト数を取得
// ( 1ピクセル 4バイトなので、1ピクセル単位にするために 4で割る )
int Pitch = GetPitchSoftImage( Screen ) / 4 ;
// ソフトイメージが格納されているメモリアドレスを取得
Image = (int*)GetImageAddressSoftImage( Screen ) ;
// 矩形の描画先にメモリアドレスを変更
Image[x + Pitch * y]=GetColor(R,G,B);
}
void FlipScreen()
{
// ソフトイメージを画面に描画
DrawSoftImage( 0, 0, Screen ) ;
}
void CalcFPS()
{
static int Before=0;
static int tmp=0;
if(GetTickCount()-Before>1000)
{
Before=GetTickCount();
tmp=FPS;
FPS=0;
}else{
FPS++;
}
DrawFormatString(0,0,GetColor(255,0,0),"FPS ON = %d",tmp);
}
};