Lighthouse3D GLSL Tutorial
http://www.lighthouse3d.com/tutorials/glsl-tutorial/
All posts by kpark
Modern OpenGL
“Modern” OpenGL is about OpenGL 2.1+, OpenGL ES 2.0+ and WebGL, with a programmable pipeline and shaders.
Modern OpenGL Programming http://en.wikibooks.org/wiki/OpenGL_Programming#Modern_OpenGL
Modern OpenGL Step-by-Step 
http://ogldev.atspace.co.uk/
GLM
GLM 0.9.4 Manual http://glm.g-truc.net/glm-0.9.4.pdf 
OpenGL Mathematics (GLM) is a C++ mathematics library for 3D software based on the OpenGL Shading Language (GLSL) specification. GLM is a header only library; there is nothing to build to use it which increases its cross  platform  capabilities.  To  use  GLM,  a  programmer  only  has  to  include  #include <glm/glm.hpp>
1. glm는 아래 파일을 다운 받아 unzip해 주어야 합니다. 
1429707804.zip2. Microsoft SDKs가 있는 디렉토리의 Include 폴더에 *.h를 넣는다. 

3. 다음 샘플코드를 사용해본다.
http://glm.g-truc.net/code.html
GLUT 3 Specification
MyFirstOpenGLShader
#include <cmath>
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <GL/freeglut_ext.h>
const float vertexPositions[] = {
 -0.75f, -0.75f, 0.0f, 1.0f,
 0.75f, -0.75f, 0.0f, 1.0f,
 0.75f, 0.75f, 0.0f, 1.0f,
};
GLuint program;
GLuint vao;
GLuint buffer;
////////////////////////////////////////////////////////////////////////////////////////////////////
// Create a NULL-terminated string by reading the provided file
static char* readShaderSource(const char* shaderFile)
{
    FILE* fp = fopen(shaderFile, “r”);
if ( fp == NULL ) { return NULL; }
    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);
    fseek(fp, 0L, SEEK_SET);
    char* buf = new char[size + 1];
    fread(buf, 1, size, fp);
    buf[size] = ”;
    fclose(fp);
    return buf;
}
// Create a GLSL program object from vertex and fragment shader files
GLuint InitShader(const char* vShaderFile, const char* fShaderFile)
{
    struct Shader {
 const char*  filename;
 GLenum       type;
 GLchar*      source;
    }  shaders[2] = {
 { vShaderFile, GL_VERTEX_SHADER, NULL },
 { fShaderFile, GL_FRAGMENT_SHADER, NULL }
    };
    GLuint program = glCreateProgram();
    
 
    for ( int i = 0; i < 2; ++i ) {
 Shader& s = shaders[i];
 s.source = readShaderSource( s.filename );
 if ( shaders[i].source == NULL ) {
     std::cerr << “Failed to read ” << s.filename << std::endl;
     exit( EXIT_FAILURE );
 }
GLuint shader = glCreateShader( s.type );
 glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
 glCompileShader( shader );
 GLint  compiled;
 glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
 if ( !compiled ) {
     std::cerr << s.filename << ” failed to compile:” << std::endl;
     GLint  logSize;
     glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logSize );
     char* logMsg = new char[logSize];
     glGetShaderInfoLog( shader, logSize, NULL, logMsg );
     std::cerr << logMsg << std::endl;
     delete [] logMsg;
     exit( EXIT_FAILURE );
 }
delete [] s.source;
 glAttachShader( program, shader );
    }
    /* link  and error check */
    glLinkProgram(program);
    GLint  linked;
    glGetProgramiv( program, GL_LINK_STATUS, &linked );
    if ( !linked ) {
 std::cerr << “Shader program failed to link” << std::endl;
 GLint  logSize;
 glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logSize);
 char* logMsg = new char[logSize];
 glGetProgramInfoLog( program, logSize, NULL, logMsg );
 std::cerr << logMsg << std::endl;
 delete [] logMsg;
 exit( EXIT_FAILURE );
    }
    /* use program object */
    glUseProgram(program);
    return program;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void init( void )
{
    // Load shaders and use the resulting shader program
    program = InitShader( “vshader21.glsl”, “fshader21.glsl” );
    glUseProgram(program);
 // VAO
 glGenVertexArrays(1, &vao);
 glBindVertexArray(vao);
 // VBO
 glGenBuffers(1, &buffer);
 glBindBuffer(GL_ARRAY_BUFFER, buffer);
 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
 glEnableVertexAttribArray(0);
 glClearColor( 1.0, 1.0, 1.0, 1.0 ); // white background
}
void display( void )
{
    glClear( GL_COLOR_BUFFER_BIT );     // clear the window
glDrawArrays(GL_TRIANGLES, 0, 3); // draw triangle
 glFlush();
}
void keyboard( unsigned char key, int x, int y )
{
    switch ( key ) {
    case 27:
        exit( EXIT_SUCCESS );
        break;
    }
}
int main( int argc, char **argv )
{
    
 glutInit(&argc, argv);
    glutInitDisplayMode( GLUT_RGBA );
    glutInitWindowSize( 512, 512 );
    glutCreateWindow(argv[0]);
    
    glewInit();
    init();
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glutMainLoop();
    return 0;
}
실행결과
	OPENGLGLUT-Getting-Started
http://dis.dankook.ac.kr/lectures/cg10/entry/OPENGLGLUT-Getting-Started
-OPENGL/GLUT 설치 (LINUX OS)
http://dis.dankook.ac.kr/lectures/cg08/entry/OPENGLGLUT-Installation
-OPENGL/GLUT 설치 (MAC OS)
http://nainu.springnote.com/pages/1064372.xhtml
Windows7 운영체제에서 Visual Studio 2010과 OpenGL 3.x 이상을 지원하는 그래픽카드 드라이버가 설치되어 있어야 합니다.
1. freeglut는 아래 파일을 다운 받아 unzip해 주어야 합니다.
http://freeglut.sourceforge.net/9191852301.zip압축을 풀어보면 include, lib, system32 세 개의 폴더가 있습니다.
2. glew는 아래 파일을 다운 받아 unzip해 주어야 합니다.
http://glew.sourceforge.net/8955048801.zip압축을 풀어보면 include, lib, system32 세 개의 폴더가 있습니다.
3. Microsoft SDKs가 있는 디렉토리의 Include와 Lib 폴더에 *.h와 *.lib을 넣는다.
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\gl 폴더에 glew.h glxew.h wglew.h를 넣습니다.
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib폴더에 freeglut.lib를 넣습니다.
C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib폴더에 glew32.lib glew32mx.lib glew32mxs.lib glew32s.lib를 넣습니다.
4. Windows\system32 폴더에 *.dll을 넣는다.
C:\Windows\system32 폴더에 glew32.dll glew32mx.dll를 넣습니다.
C:\Windows\SysWOW64 폴더에도 freeglut.dll를 넣습니다.
C:\Windows\SysWOW64 폴더에도 glew32.dll glew32mx.dll를 넣습니다.
4. 세팅이 모두 끝나면, 프로젝트를 Win32 Console로 생성(File->New->Project, 템플렛에서 Win32->Win32 Console Application을 선택하고 <your project name>을 넣는다)하고, 아래의 소스를 넣어 컴파일, 실행해 봅니다.
#include <cmath>
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <GL/freeglut_ext.h>
{
}
{
glClearColor( 1.0, 1.0, 1.0, 1.0 ); // white background
glClear( GL_COLOR_BUFFER_BIT ); // clear the window
}
{
switch ( key ) {
case 27:
exit( EXIT_SUCCESS );
break;
}
}
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_RGBA );
glutInitWindowSize( 512, 512 );
glutCreateWindow( “Your First OpenGL” );
glewInit();
init();
glutKeyboardFunc( keyboard );
return 0;
}
5. 이때, opengl32.lib glu32.lib glut32.lib 라이브러리 링크를 걸어줍니다.

6. 컴파일/링크(Build)(F7)후 실행(Debug)(F5)시켜서 하얀색화면의 윈도우가 뜨면 완성된 것입니다.