最終更新: mikk_ni3_92 2010年02月08日(月) 17:40:37履歴
現在地:メニュー >> GLSL >> GLSL編01 >> GLSL編01::まとめコード
#include <iostream> #include <string> #include <fstream> #include <gl/glew.h> #include <gl/glut.h> #pragma comment (lib,"glew32.lib") GLuint vShaderId; GLuint fShaderId; GLuint programId; //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); std::cout << "[ vertex shader ] \n-----\n"<< &fileData1[0] << "\n";//シェーダの内容を出力 std::cout << "[ fragment shader ]\n-----\n"<< &fileData2[0] << "\n";//シェーダの内容を出力 } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3,4,5,0,0,0,0,1,0); glutWireTeapot(1); 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 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("Hello GLSL"); glutDisplayFunc(display); glutReshapeFunc(reshape); init(); glewInit(); if (!glewIsSupported("GL_VERSION_2_0")) { std::cerr << "Can't Use GLSL\n"; return -1; } setUpGLSL(); glutMainLoop(); glDeleteShader(vShaderId); glDeleteShader(fShaderId); glDeleteProgram(programId); return 0; }