最終更新: mikk_ni3_92 2010年02月23日(火) 17:07:42履歴
現在地:メニュー >> GLSL >> GLSL編06 >> GLSL編06::まとめ
//頂点シェーダ void main(void) { //投影変換 (モデルビュー * プロジェクション) * 頂点座標 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //0番目のテクスチャユニットの座標をそのまま与える gl_TexCoord[0] = gl_MultiTexCoord0; }
uniform sampler2D texture0;//テクスチャユニット0 //フラグメント void main(void) { //指定のテクスチャユニット、現在バインドされている //テクスチャオブジェクトからサンプリングする gl_FragColor = texture2D(texture0,gl_TexCoord[0].st); }
#include <iostream> #include <string> #include <fstream> #include <gl/glew.h> #include <gl/glut.h> #include <cv.h> #include <highgui.h> #pragma comment (lib,"glew32.lib") #pragma comment (lib,"cv200.lib") #pragma comment (lib,"cxcore200.lib") #pragma comment (lib,"highgui200.lib") GLuint TexId; const char *filename="box.png"; GLuint vShaderId; GLuint fShaderId; GLuint programId; //テクスチャの読み込み void LoadTexture() { cv::Ptr<IplImage> imgA = cvLoadImage(filename); if(imgA.empty()) { std::cerr << "Can't Load Image\n"; exit(0); } glGenTextures(1,&TexId); glBindTexture(GL_TEXTURE_2D,TexId); 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,GL_RGB, imgA->width,imgA->height,0, GL_BGR,GL_UNSIGNED_BYTE,imgA->imageData); } //GLSLのセットアップ void setUpGLSL() { //---- 頂点シェーダオブジェクトの作成 ----// vShaderId = glCreateShader(GL_VERTEX_SHADER); //.vertファイルの中身を全て読み込む std::ifstream inputFile1("glsl.vert"); std::istreambuf_iterator<char> vdataBegin(inputFile1); std::istreambuf_iterator<char> vdataEnd; std::string fileData1(vdataBegin,vdataEnd); const char *vfile = fileData1.c_str(); //ソースコードをシェーダオブジェクトに変換 glShaderSource(vShaderId, 1, &vfile,NULL); glCompileShader(vShaderId);//コンパイル //---- フラグメントシェーダオブジェクトの作成 ----// fShaderId = glCreateShader(GL_FRAGMENT_SHADER); //.fragファイルの中身を全て読み込む std::ifstream inputFile2("glsl.frag"); std::istreambuf_iterator<char> fdataBegin(inputFile2); std::istreambuf_iterator<char> fdataEnd; std::string fileData2(fdataBegin,fdataEnd); const char *ffile = fileData2.c_str(); //ソースコードをシェーダオブジェクトに変換 glShaderSource(fShaderId, 1, &ffile,NULL); glCompileShader(fShaderId);//コンパイル //プログラムオブジェクトの作成 programId = glCreateProgram(); glAttachShader(programId,vShaderId); glAttachShader(programId,fShaderId); GLint linked; glLinkProgram(programId); glGetProgramiv(programId, GL_LINK_STATUS, &linked); if(linked == GL_FALSE) { std::cerr << "Link Err.\n"; } glUseProgram(programId); //変数名texture0には「0」が入っている glUniform1i(glGetUniformLocation(programId, "texture0"), 0);//テクスチャユニット0とする } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3,4,5,0,0,0,0,1,0); glColor3f(1,0,1); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, TexId); glutSolidTeapot(1); glBindTexture(GL_TEXTURE_2D, 0); glutSwapBuffers(); } void reshape(int w, int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30,double(w)/h,0.1,200); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { if(key == 'q') { glDeleteTextures(1,&TexId); glDeleteShader(vShaderId); glDeleteShader(fShaderId); glDeleteProgram(programId); exit(0); } } void init() { glClearColor(1,1,1,1); glEnable(GL_DEPTH_TEST); } int main(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); glutInitWindowSize(640,480); glutCreateWindow("Basic Texture Mapping"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); init(); glewInit(); if (!glewIsSupported("GL_VERSION_2_0")) { std::cerr << "Can't Use GLSL\n"; return -1; } LoadTexture();//テクスチャの読み込み setUpGLSL(); glutMainLoop(); return 0; }