最終更新:
mikk_ni3_92 2010年06月14日(月) 20:44:24履歴
現在地:メニュー >> GLSL >> GLSL編08 >> GLSL編08::まとめ1
関連:GLSL編08::まとめ2
関連:GLSL編08::まとめ2
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) );
gl_PointSize = 10;//点のサイズを10にする
}
#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(3,4,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);
}
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;
}

