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

問題


以下の画像を読み込んでテクスチャをはれ。
その他条件:
  • アニメーションを行う。
  • jpg画像

答え

vertex.cg(頂点シェーダ)

//出力用データ構造
struct VERTEX_DATA
{
	float4 position : POSITION;
	float2 texCoord : TEXCOORD0;
};


//----- 頂点シェーダメイン関数 ----//
VERTEX_DATA Cg_Main(in float4 position : POSITION, //4次元(x,y,z,w)で入力にする
					in float2 texCoord : TEXCOORD0,
					uniform float4x4 modelViewMatrix)
{
	VERTEX_DATA OUT;

	OUT.position = mul(modelViewMatrix, position); //透視投影
	OUT.texCoord = texCoord;				//テクスチャ座標

	return OUT;
}

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

//データ構造
struct COLOR_OUTPUT {
	float4 color : COLOR;
};


//--------- フラグメントメイン関数 -----------//
COLOR_OUTPUT Cg_Fragment_Main(in float2 texCoord : TEXCOORD0, 
								uniform sampler2D decal : TEX0)
{
	COLOR_OUTPUT OUT;
	
	OUT.color = tex2D(decal,texCoord); //テクスチャから色を取得
	
	return OUT;
}

main.cpp(メイン関数)


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

using namespace std;
const char *filename = "test2.jpg"; 

//----------  Cg用変数 ---------------//
CGcontext CgContext;//コンテキスト
//頂点関係
CGprofile CgVertexProfile;
CGprogram CgVertexProgram;
CGparameter modelview;//透視投影行列取得用


//フラグメント関係
CGprofile CgFragmentProfile;
CGprogram CgFragmentProgram;
CGparameter CgFragmentParam_decal; //Cgフラグメント関係パラメータ


//---- テクスチャID  ---//
unsigned int texture[1];



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


void display(void);
void reshape(int w, int h);
void timer(int value);

void DRAW_SQU();

//----- 画像読み込み準備 ----------------//
void LoadGLTextures()
{

	IplImage *imgA=cvLoadImage(filename,CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
	if(imgA==NULL)
	{
		std::cerr << filename <<" : Can't Load Image\n";
		return ;
	}


	cvFlip(imgA);

	//----- テクスチャ作成 -----//
	glGenTextures(1, &texture[0]);
	glBindTexture(GL_TEXTURE_2D, texture[0]);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

	glTexImage2D(GL_TEXTURE_2D,0,3, imgA->width,imgA->height,0, GL_BGR,GL_UNSIGNED_BYTE,imgA->imageData);

	cvReleaseImage( &imgA );
};




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


void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutTimerFunc(0,timer,17);

}


void MY_INIT()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	LoadGLTextures();
}



//--------- 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 << cgGetErrorString(cgGetError()) << "\n";
		exit(0);
	}

	//CGparameter型の名前を設定、シェーダファイルで「modelViewMatrix」という変数名
	modelview = cgGetNamedParameter(CgVertexProgram, "modelViewMatrix");


}


//フラグメントシェーダのセットアップ
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 << cgGetErrorString(cgGetError()) << "\n";
		exit(0);
	}

	//フラグメント用パラメータの関連付け
	CgFragmentParam_decal = cgGetNamedParameter(CgFragmentProgram, "decal");//名前
	cgGLSetTextureParameter(CgFragmentParam_decal, texture[0]); //テクスチャとの関連付け

}


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

	GLUT_INIT();
	GLUT_CALL_FUNC();

	MY_INIT();
	CG_INIT();//Cgセットアップ

	glutMainLoop();

	return 0;
}



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

	static float r = 0;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);


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

	cgGLBindProgram(CgFragmentProgram);
	cgGLEnableProfile(CgFragmentProfile);
	cgGLEnableTextureParameter(CgFragmentParam_decal);

	glPushMatrix();
	glRotated(static_cast<float>(r),0,1,0);

	cgGLSetStateMatrixParameter(modelview,CG_GL_MODELVIEW_PROJECTION_MATRIX,CG_GL_MATRIX_IDENTITY);

	DRAW_SQU();
	glPopMatrix();
	//Cgの無効化
	cgGLDisableProfile(CgVertexProfile);
	cgGLDisableProfile(CgFragmentProfile);
	cgGLDisableTextureParameter(CgFragmentParam_decal);

	glutSwapBuffers();
	if(++r > 360) r = 0;

}


void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
	glMatrixMode(GL_MODELVIEW);
}

void timer(int t)
{
	display();
	glutTimerFunc(t,timer,17); //タイマー関数
}


//----------- ここから各種関数 --------------//
void DRAW_SQU()
{
	glBegin(GL_QUADS);
	glTexCoord2f(0.0, 1.0);glVertex2f(-1,1);
	glTexCoord2f(0.0, 0.0);glVertex2f(-1, -1);
	glTexCoord2f(1.0, 0.0);glVertex2f(1, -1);
	glTexCoord2f(1.0, 1.0);glVertex2f(1,1);
	glEnd();
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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