最終更新: mikk_ni3_92 2009年02月09日(月) 17:03:24履歴
現在地 >> メニュー >> サンプルコード::Cg >> Cg::基本編06 >> Cg::基本編06まとめ1
画像を読み込んで、ポリゴンにテクスチャをはれ。
画像を読み込んで、ポリゴンにテクスチャをはれ。
//出力用データ構造 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; }
//データ構造 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; }
#include <iostream> #include <cv.h> #include <highgui.h> #include <GL/glut.h> #include <Cg/cg.h> #include <Cg/cgGL.h> 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 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); } 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) { 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); cgGLSetStateMatrixParameter(modelview,CG_GL_MODELVIEW_PROJECTION_MATRIX,CG_GL_MATRIX_IDENTITY); DRAW_SQU(); //Cgの無効化 cgGLDisableTextureParameter(CgFragmentParam_decal); cgGLDisableProfile(CgVertexProfile); cgGLDisableProfile(CgFragmentProfile); glutSwapBuffers(); } 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 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(); }