最終更新:
mikk_ni3_92 2010年02月23日(火) 13:09:30履歴
現在地:メニュー >> GLSL >> GLSL編04 >> GLSL編04::まとめ1
関連:GLSL編04::まとめ2
関連:GLSL編04::まとめ2
//今回は材質係数をシェーダソースに埋め込んでいる const float4 ambMaterial = float4( 0.24725, 0.1995, 0.0745,1); const float4 diffMaterial = float4(0.75164, 0.60648 , 0.22648,1); const float4 specMaterial = float4(0.628281, 0.555802,0.366065,1); const float shinMaterial = 51.2 ; //頂点シェーダ void main(void) { //投影変換 (モデルビュー * プロジェクション) * 頂点座標 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; //ambient計算 float4 ambient = gl_LightSource[0].ambient * ambMaterial;//ambientの計算 //各種基本的なベクトルを計算 vec3 N = normalize(gl_NormalMatrix * gl_Normal);//視点座標の法線+正規化 vec4 V = gl_ModelViewMatrix * gl_Vertex;//視点座標系の頂点位置 vec3 L = normalize(gl_LightSource[0].position.xyz - V.xyz);//頂点→光源へのベクトル //diffuse計算 float NdotL = dot(N,L); vec4 diffuse = vec4( max(0.0,NdotL) ) * gl_LightSource[0].diffuse * diffMaterial; //specular計算(Bilnのモデルを使用) vec3 H = normalize(gl_LightSource[0].halfVector.xyz); float NdotH = dot(N,H); vec4 specular = pow(max(0.0,NdotH),shinMaterial); if(NdotL <=0)//条件によってはspecular無し { specular = 0; } specular = specular* gl_LightSource[0].specular * specMaterial; //出力色 gl_FrontColor = ambient + diffuse + specular; }
#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); } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); static float Light0Pos[]={1,1,1,0}; //光源の位置 glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);//位置だけ設定(あとはデフォルト) gluLookAt(0,0,5,0,0,0,0,1,0); glutSolidSphere(0.5,60,60); 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) { switch(key) { case 'q': glDeleteShader(vShaderId); glDeleteShader(fShaderId); glDeleteProgram(programId); exit(0); break; } } void init() { glClearColor(0.3,0.3,0.3,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 Lighting"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); init(); glewInit(); if (!glewIsSupported("GL_VERSION_2_0")) { std::cerr << "Can't Use GLSL\n"; return -1; } setUpGLSL(); glutMainLoop(); return 0; }