译序
早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNorma等固定管线API。
openGL ES 2.0 版本开始不再支持固定管线,只支持可编程管线。
准备
1.The OpenGL Extension Wrangler(GLEW) 是用来访问OpenGL 3.2 API函数的。
不能简单的使用gl.h来访问OpenGL接口,除非你相用旧版的OpenGL。
在现代OpenGL中,API函数是在运行时(run time)确定的,而非编译期(compile time)
GLEW可以在运行时加载OpenGL API。
2.GLFW 允许我们跨平台创建窗口,接受键盘鼠标消息。OpenGL不处理这些窗口创建和输入。
3.OpenGL Mathematics(GLM)是一个数学库,用来处理矢量和矩阵等几乎其他所有的东西。
旧版OpenGL提供了glRotate glTranslate和glSale等函数。
在现代OpenGL函数中 这些函数已经不存在了。我们需要自己处理所有的数学运算。
Shaders
shaders是一段GLSL小程序,运行在GPU而非CPU。
他们使用OpenGL Shading Language(GLSL)语言编写。看上去像C/C++.
像其他编程语言一样,使用Shaders需要编译链接成可执行程序。
旧版OpenGL中Shaders是可选的,现代OpenGL中 Shaders是必须的。
Vertex Shaders
Vertex shader主要是将点(X Y Z)变换为不同的点。顶点只是几何形状中的一个点,一个点叫vertex
多个点叫vertices
Fragment Shaders
fragment shader 的主要功能是计算每一个需要绘制的像素点的颜色。
一个fragment是一个像素 片段着色器(fragment shader)就是像素着色器(pixel shader)。
编译shaders
--------------------------------------------------------
//create the shader object
GLuint _object = glCreateShader(GL_VERTEX_SHADER);
if(_object == 0)
throw std::runtime_error("glCreateShader failed");
//set the source code
const char* code = shaderCode.c_str();
glShaderSource(_object, 1, (const GLchar**)&code, NULL);
//compile
glCompileShader(_object);
//throw exception if compile error occurred
GLint status;
glGetShaderiv(_object, GL_COMPILE_STATUS, &status);
if (status == GL_FALSE) {
std::string msg("Compile failure in shader:\n");
GLint infoLogLength;
glGetShaderiv(_object, GL_INFO_LOG_LENGTH, &infoLogLength);
char* strInfoLog = new char[infoLogLength + 1];
glGetShaderInfoLog(_object, infoLogLength, NULL, strInfoLog);
msg += strInfoLog;
delete[] strInfoLog;
glDeleteShader(_object); _object = 0;
throw std::runtime_error(msg);
}
-----------------------------------------------------------------------
解析shadres
------------------------------------------------------------------------
//create the program object
GLuint _object = glCreateProgram();
if(_object == 0)
throw std::runtime_error("glCreateProgram failed");
//attach all the shaders
for(unsigned i = 0; i < shaders.size(); ++i)
glAttachShader(_object, shaders[i].object());
//link the shaders together
glLinkProgram(_object);
//detach all the shaders
for(unsigned i = 0; i < shaders.size(); ++i)
glDetachShader(_object, shaders[i].object());
//throw exception if linking failed
GLint status;
glGetProgramiv(_object, GL_LINK_STATUS, &status);
if (status == GL_FALSE) {
std::string msg("Program linking failure: ");
GLint infoLogLength;
glGetProgramiv(_object, GL_INFO_LOG_LENGTH, &infoLogLength);
char* strInfoLog = new char[infoLogLength + 1];
glGetProgramInfoLog(_object, infoLogLength, NULL, strInfoLog);
msg += strInfoLog;
delete[] strInfoLog;
glDeleteProgram(_object); _object = 0;
throw std::runtime_error(msg);
}
----------------------------------------------------------------------------
参考:
http://huangwei.pro/2015-05/modern-opengl1/
https://www.opengl.org/sdk/docs/man/html/
http://www.cocoachina.com/game/20141127/10335.html
http://blog.csdn.net/candycat1992/article/details/39675513
http://fengmm521.blog.163.com/blog/static/2509135820133254936364/
http://blog.csdn.net/afei198409/article/details/8255518
http://blog.csdn.net/mzyang272/article/details/7655464