現在地メニュー >> Cg >> Cg編02 >> Cg編02::まとめ

問題


三角形ポリゴンを描画せよ。
ただし頂点シェーダ(vertex.cg)、フラグメントシェーダ(fragment.cg)を記述せよ。

答え

main.cpp

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

#pragma comment (lib,"cg.lib")
#pragma comment (lib,"cgGL.lib")

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

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

//-------- Cgの初期設定 -----------//
//頂点シェーダ設定
void setUpCgVertex()
{
	//プロファイルの取得
	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, //プロファイル
				"CgVertexMain", //「.cgファイル」で最初にいく関数
				NULL); //NULLでよい

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

//フラグメントの初期設定
void setUpCgFragment()
{
	//プロファイルの取得
	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, //プロファイル
				"CgFragmentMain", //「.cgファイル」で最初にいく関数
				NULL); //NULLでよい

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

void CgINIT()
{
	//コンテキスト作成
	CgContext = cgCreateContext();
	if(CgContext == NULL){
		std::cerr << "Can't Create Context\n";
		exit(0);
	}

	setUpCgVertex();
	setUpCgFragment();

}


//------------ GLUTの初期設定 ---------------//
void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
}

void GLUT_INIT(int argc,char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("Hello Cg with OpenGL");
	GLUT_CALL_FUNC();
}

//---------- メイン関数 ---------------//
int main(int argc,char **argv)
{
	GLUT_INIT(argc,argv);

	CgINIT();//Cgセットアップ

	glutMainLoop();

	return 0;
}


//----------- ここから各種コールバック -----------------//
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

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

	cgGLBindProgram(CgFragmentProgram);
	cgGLEnableProfile(CgFragmentProfile);

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

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

	glutSwapBuffers();
}

頂点シェーダ(vertex.cg)

//入力頂点
struct VertexIn
{
	float2 position : POSITION;
	float3 color : COLOR;
};

//出力頂点
struct VertexOut
{
	float4 position : POSITION;
	float3 color : COLOR;
};

////-------- 頂点シェーダメイン関数 ---------//
VertexOut CgVertexMain(VertexIn input)
{
	VertexOut output;//出力用

	output.position = float4(input.position.xy,0,1);//位置
	output.color = input.color.rgb;//色

	return output;
}

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

//フラグメントの入力
struct FragmentIn
{
	float4 position : POSITION; //ラスタライズ用(使用しない)
	float3 color : COLOR;
};

//フラグメントの出力
struct FragmentOut
{
	float3 color : COLOR;
};

//--------- フラグメントシェーダメイン関数 ------------//
FragmentOut CgFragmentMain(in FragmentIn input)
{
	FragmentOut output;//フラグメント出力
	output.color = input.color;

	return output;
}
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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