最終更新: mikk_ni3_92 2010年02月26日(金) 17:26:33履歴
現在地:メニュー >> Cg >> Cg編08 >> Cg編08::まとめ2
//入力頂点 struct VertexIn { float4 position : POSITION; float2 texcoord : TEXCOORD0; }; //出力頂点 struct VertexOut { float4 position : POSITION; float2 texcoord : TEXCOORD0; }; //-------- 頂点シェーダメイン関数 ---------// VertexOut CgVertexMain(in VertexIn input,uniform float4x4 modelViewProj) { VertexOut output;//出力用 output.position = mul(modelViewProj, input.position); output.texcoord = input.texcoord; return output; }
//フラグメントの入力 struct FragmentIn { float4 position : POSITION; //ラスタライズ用(使用しない) float2 texcoord : TEXCOORD0; }; //フラグメントの出力 struct FragmentOut { float3 color : COLOR; }; //--------- フラグメントシェーダメイン関数 ------------// FragmentOut CgFragmentMain(in FragmentIn input, uniform sampler2D decal : TEX0)//TEX0でも可 { FragmentOut output;//フラグメント出力 output.color = tex2D(decal,input.texcoord); return output; }
#include <iostream> #include <cv.h> #include <highgui.h> #include <gl/glew.h> #include <GL/glut.h> #include <Cg/cg.h> #include <Cg/cgGL.h> #pragma comment (lib,"cg.lib") #pragma comment (lib,"cgGL.lib") #pragma comment (lib,"glew32.lib") #ifdef _DEBUG #pragma comment(lib,"cv200d.lib") #pragma comment(lib,"cxcore200d.lib") #pragma comment(lib,"highgui200d.lib") #else #pragma comment(lib,"cv200.lib") #pragma comment(lib,"cxcore200.lib") #pragma comment(lib,"highgui200.lib") #endif //-------- 各種外部変数 -------------// //Cg用変数 CGcontext CgContext; //コンテキスト CGprofile CgVertexProfile;//頂点プロファイル CGprogram CgVertexProgram; CGprofile CgFragmentProfile;//フラグメントプロファイル CGprogram CgFragmentProgram; CGparameter CgModelViewProj; //CGparameter型(ModelProj行列を取得) CGparameter CgFragmentParam_decal;//テクスチャId関連付け用 //画像サイズ情報 struct ImageSizeInfo { int w; int h; }; ImageSizeInfo imgInfo; //テクスチャ関連 GLuint texId; const char *filename = "posz.jpg"; //-------- プロトタイプ宣言 -----// void display(); void reshape(int w, int h); void drawXYZ(); //-------- テクスチャ読み込み------------------// bool LoadTexture() { cv::Ptr<IplImage> imgA = cvLoadImage(filename); if(imgA.empty()) { return false; } cv::Ptr<IplImage> imgF = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_32F,3); cvConvertImage(imgA,imgA,CV_CVTIMG_SWAP_RB|CV_CVTIMG_FLIP); glGenTextures(1,&texId); glBindTexture(GL_TEXTURE_2D,texId); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,imgA->width,imgA->height,0, GL_RGB,GL_UNSIGNED_BYTE,imgA->imageData); glBindTexture(GL_TEXTURE_2D,0); imgInfo.w = imgA->width; imgInfo.h = imgA->height; return true; } //-------- 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); } //パラメータの関連付け CgModelViewProj = cgGetNamedParameter(CgVertexProgram, "modelViewProj"); } //フラグメントの初期設定 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); } //fragment.cgではテクスチャの名前は「decal」 CgFragmentParam_decal = cgGetNamedParameter(CgFragmentProgram, "decal"); //テクスチャIDと関連付け cgGLSetTextureParameter(CgFragmentParam_decal, texId); //テクスチャとの関連付け } 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); glutReshapeFunc(reshape); } void OtherMyInit() { glClearColor(1,1,1,1); glEnable(GL_DEPTH_TEST); } void GLUT_INIT(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Image Proc with Cg"); GLUT_CALL_FUNC(); OtherMyInit(); } //---------- メイン関数 ---------------// int main(int argc,char **argv) { GLUT_INIT(argc,argv); if (LoadTexture() == false) { std::cerr << "Can't Load Image\n"; return -1; }; CgINIT();//Cgセットアップ glutMainLoop(); return 0; } //----------- ここから各種コールバック -----------------// void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //Cgの有効化 cgGLBindProgram(CgVertexProgram); cgGLEnableProfile(CgVertexProfile); cgGLBindProgram(CgFragmentProgram); cgGLEnableProfile(CgFragmentProfile); //現在のmodelview,projection行列を取得 cgGLSetStateMatrixParameter(CgModelViewProj, CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY); cgUpdateProgramParameters(CgVertexProgram);//プログラムのパラメータの更新 cgGLEnableTextureParameter(CgFragmentParam_decal);//テクスチャの有効化 glColor3f(0,1,0); glBegin(GL_QUADS); glTexCoord2f(0.f,0.f); glVertex2f(0.f,0.f); glTexCoord2f(1,0.f); glVertex2f(imgInfo.w,0.f); glTexCoord2f(1, 1); glVertex2f(imgInfo.w, imgInfo.h); glTexCoord2f(0.f, 1); glVertex2f(0.f, imgInfo.h); glEnd(); //Cgの無効化 cgGLDisableTextureParameter(CgFragmentParam_decal); cgGLDisableProfile(CgVertexProfile); cgGLDisableProfile(CgFragmentProfile); glutSwapBuffers(); } void reshape(int w, int h) { glutReshapeWindow(imgInfo.w,imgInfo.h);//画像サイズにウィンドウを合わせる glViewport(0, 0, imgInfo.w,imgInfo.h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,imgInfo.w,0,imgInfo.h); glMatrixMode(GL_MODELVIEW); }