Category Archives: Modern OpenGL

Parallelpiped

사용자 삽입 이미지void Parallelpiped::init()
{
 glm::vec3 pu = p + u;
 glm::vec3 pv = p + v;
 glm::vec3 pw = p + w;
 glm::vec3 puv = p + u + v;
 glm::vec3 pvw = p + v + w;
 glm::vec3 puw = p + u + w;
 glm::vec3 puvw = p + u + v + w;


 // Front face
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 
 // Back face
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));


 // Left face
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));


 // Right face
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));


 // Top face
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&puw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pw[0], sizeof(glm::vec3));
 vbo.addData(&puvw[0], sizeof(glm::vec3));
 vbo.addData(&pvw[0], sizeof(glm::vec3));


 // Bottom face
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&puv[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&pv[0], sizeof(glm::vec3));
 vbo.addData(&pu[0], sizeof(glm::vec3));
 vbo.addData(&p[0], sizeof(glm::vec3));


 numVertices = 36;


 // create VBO
 vbo.createVBO();
 vbo.bindVBO();
 vbo.uploadDataToGPU(GL_STATIC_DRAW);


 // create a VAO
 glGenVertexArrays(1, &vao);
 glBindVertexArray(vao);
 glEnableVertexAttribArray(0);
 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);


 isLoaded = true;
}

GLM Matrix (Column-major order)

int foo()
{
glm::vec4 Position = glm::vec4(glm:: vec3(0.0f), 1.0f);
glm::mat4 Model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f, 2.0f, 3.0f));
printf(“%f %f %f %f\n”, Model[0][0], Model[1][0], Model[2][0], Model[3][0]);
printf(“%f %f %f %f\n”, Model[0][1], Model[1][1], Model[2][1], Model[3][1]);
printf(“%f %f %f %f\n”, Model[0][2], Model[1][2], Model[2][2], Model[3][2]);
printf(“%f %f %f %f\n”, Model[0][3], Model[1][3], Model[2][3], Model[3][3]);

glm::vec4 Transformed = Model * Position;

return 0;
}

OpenGL Programmable Pipeline

http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html

사용자 삽입 이미지
Modern OpenGL (OpenGL 3.x) 프로그래밍은 다음과 같은 단계로 진행한다.
1.Shader 프로그램을 만든다.
2.Vertex 자료를 Vertex Buffer Object (VBO)와 Vertex Array Object (VAO)를 만들고 이 자료를 쉐이더에 로딩한다.
3.이 자료의 위치와 쉐이더의 변수와 “연결(Connect)” 한다.
4.렌더링을 수행한다.

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를 넣는다.


C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include 폴더에 glm 폴더 전체를 복사해 넣습니다.
사용자 삽입 이미지
3. 다음 샘플코드를 사용해본다.
http://glm.g-truc.net/code.html