最終更新:
mikk_ni3_92 2010年06月19日(土) 15:18:05履歴
現在地:メニュー >> GLSL >> GLSL編08 >> GLSL編08::まとめ2
関連:GLSL編08::まとめ1
関連:GLSL編08::まとめ1
uniform vec3 lightPos;//光源位置 //頂点シェーダ void main(void) { //投影変換 (モデルビュー * プロジェクション) * 頂点座標 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vec3 N = normalize(gl_NormalMatrix * gl_Normal); vec4 V = gl_ModelViewMatrix * gl_Vertex; //視点座標系 vec3 L = normalize(lightPos - V.xyz); float NdotL = dot(N,L); gl_FrontColor = gl_Color * vec4( max(0.0,NdotL) ); float pSize = length(V); pSize *= pSize; //適当に重み付け gl_PointSize = 300.0/pSize; }
#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; float lightPosition[3] = {-3,4,5}; GLint litPosId; //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); litPosId = glGetUniformLocation(programId,"lightPos");//シェーダでの名前 glUniform3fv(litPosId,1,lightPosition);//値設定 } void display() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(0,0,5,0,0,0,0,1,0); glColor3f(1,0,1); glutSolidTeapot(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); glPolygonMode(GL_FRONT_AND_BACK,GL_POINT); glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); glEnable(GL_POINT_SMOOTH); } int main(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); glutInitWindowSize(640,480); glutCreateWindow("GLSL PointSize"); 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); return 0; }