現在地メニュー >> サンプルコード::Cg >> Cg::基本編03 >> Cg::基本編03まとめ1
関連:Cg::基本編03まとめ2

問題


ウィンドウを作ってその中に三角形を描画せよ。
その他条件:
  • コールバック関数は、glutDisplayFunc()のみでよい

答え

頂点シェーダ(vertex.cg)


//-------- 頂点シェーダメイン関数 ---------//
void Cg_Main(in float2 PositionIn : POSITION, in float3 ColorIn : COLOR,
			out float4 PositionOut : POSITION, out float3 ColorOut : COLOR)
{
	PositionOut = float4(PositionIn,0,1);
	ColorOut = ColorIn;
}

フラグメントシェーダ(fragment.cg)


//--------- フラグメントシェーダメイン関数 ------------//
void Cg_Fragment_Main(in float3 ColorIn : COLOR,out float3 ColorOut:COLOR)
{
	ColorOut = ColorIn;
}

メイン関数(main.cpp)


#include <iostream>
#include <GL/glut.h>
#include <Cg/cg.h>
#include <Cg/cgGL.h>

//-------- 各種外部変数 -------------//
//Cg用変数
CGcontext CgContext; //コンテキスト
CGprofile CgVertexProfile;//頂点
CGprogram CgVertexProgram;
CGprofile CgFragmentProfile;//フラグメント
CGprogram CgFragmentProgram;


//-------- プロトタイプ宣言 -----//
void SET_UP_CG_VERTEX();
void SET_UP_CG_FRAGMENT();
void display();


//-------- OpenGLの初期設定 ---------//
void GLUT_INIT()
{
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("Hello Cg with OpenGL");
}


void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
}


//-------- Cgの初期設定 -----------//
void CG_INIT()
{
	//コンテキスト作成
	CgContext = cgCreateContext();
	if(CgContext == NULL){
		std::cerr << "Can't Create Context\n";
		exit(0);
	}

	SET_UP_CG_VERTEX(); //頂点セットアップ
	SET_UP_CG_FRAGMENT();//フラグメントセットアップ
}

//頂点シェーダ設定
void SET_UP_CG_VERTEX()
{

	//プロファイルの設定
	CgVertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);
	if(CgVertexProfile == CG_PROFILE_UNKNOWN)
	{
		std::cerr << "Invalid profile type\n";
		exit(0);
	}
	cgGLSetOptimalOptions(CgVertexProfile);


	//ファイルを読んでコンパイル
	CgVertexProgram = cgCreateProgramFromFile(
					CgContext,//コンテキスト
					CG_SOURCE,//Cgソースコード
					"vertex.cg", //「.cgファイル名」
					CgVertexProfile, //プロファイル
					"Cg_Main", //「.cgファイル」で最初にいく関数
					NULL); //NULLでよい

	cgGLLoadProgram(CgVertexProgram);//プログラムのロード
	if(CgVertexProgram==NULL){
		std::cerr <<"Vertex Program Err. \n";
		exit(0);
	}

}


//フラグメントシェーダ設定
void SET_UP_CG_FRAGMENT()
{
	//プロファイル
	CgFragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
	if(CgFragmentProfile == CG_PROFILE_UNKNOWN){
		std::cerr << "Fragment : profile is unknown\n";
		exit(0);
	}
	cgGLSetOptimalOptions(CgFragmentProfile);

	//プログラムのコンパイル
	CgFragmentProgram = cgCreateProgramFromFile(
					CgContext,//コンテキスト
					CG_SOURCE,//Cgソースコード
					"fragment.cg", //「.cgファイル名」
					CgFragmentProfile, //プロファイル
					"Cg_Fragment_Main", //「.cgファイル」で最初にいく関数
					NULL); //NULLでよい

	cgGLLoadProgram(CgFragmentProgram); //プログラムのロード
	if(CgFragmentProgram==NULL){
		std::cerr <<"Fragment Program Err. \n";
		exit(0);
	}
}


//---------- メイン関数 ---------------//
int main(int argc,char **argv)
{
	glutInit(&argc,argv);
	GLUT_INIT();
	GLUT_CALL_FUNC();
	CG_INIT();//Cgセットアップ

	glutMainLoop();

	return 0;
}



//----------- ここから各種コールバック -----------------//
void display()
{

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	//Cgの有効化
	cgGLBindProgram(CgVertexProgram);
	cgGLEnableProfile(CgVertexProfile);

	cgGLBindProgram(CgFragmentProgram);
	cgGLEnableProfile(CgFragmentProfile);


	glBegin(GL_TRIANGLES);
	glColor3f(0,1,0);
	glVertex2f(-0.8, 0.8);
	glVertex2f(0.8, 0.8);
	glVertex2f(0.0, -0.8);
	glEnd();

	//Cgの無効化
	cgGLDisableProfile(CgVertexProfile);
	cgGLDisableProfile(CgFragmentProfile);


	glutSwapBuffers();
}

メモ


この例では、入力データをそのまま出力にしている。
つまり
頂点シェーダでは、透視投影ではなく、並行投影、
ピクセルシェーダでは、頂点の色からの線形補間色がそのまま代入される。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます