GLUT是一个实用工具库, 用于创建窗口和相应鼠标事件等。
与glut类似,glut是比较早期的工具。
GPU的厂商(如Nvidia,AMD)会提供他们独有的高级扩展函数,GLEW会自动搜索这些函数以供用户使用。
附加包含目录, C/C++ -> 常规 -> 附加包含目录。
附加库目录,链接器 -> 常规 -> 附加库目录。
添加依赖项,链接器 -> 输入 -> 添加依赖项。
若采用静态链接库,则需要定义GLEW_STATIC。 C/C++ -> 预处理器 ->预处理器定义。
#include
#include
#include
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
// glewInit必须在context之后
GLenum err = glewInit();
if (GLEW_OK == err) {
std::cout << "Glew init successful!" << std::endl;
std::cout << glGetString(GL_VERSION) << std::endl;
}
else {
std::cout << "Glew init failed!" << std::endl;
return -1;
}
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
glew.h要在glfw3.h之前,glewInit要在glfwMakeContext之后。
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex2d(0.0f, 1.0f);
glVertex2d(0.5f, 0.0f);
glVertex2d(-0.5f, 0.0f);
glEnd();
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
OpenGl的坐标系是从-1到1的。
// 顶点信息
float positions[8] = {
0.0f, 1.0f,
0.5f, 0.0f,
-0.5f, 0.0f,
0.0f, 1.0f
};
// 缓存id
GLenum bufferId;
// 申请缓存
glGenBuffers(1, &bufferId);
// 选择当前缓存
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
// 缓存中的数据赋值
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), &positions, GL_STATIC_DRAW);
// 启用(状态机的)顶点属性
glEnableVertexAttribArray(0);
// 设置顶点的布局,第一个参数为属性索引,对应glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
// 绘制缓存数据,最后一个参数为总共几个顶点
glDrawArrays(GL_LINE_STRIP, 0, 4);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
OpenGL可以看成是一个状态机,别忘了要启用顶点属性,不然画不出来。
有几个顶点,则顶点着色器就会被调用几次,如三角形三个顶点会调用三次顶点着色器。
片元着色器(也叫像素着色器)决定每个像素的颜色,所以可能被调用上千次。
矢量的点线面描述变成像素的描述。图片来源
/*载入着色器*/
std::map<std::string, unsigned int> shaderMap;
shaderMap["resources/shaders/BasicVertexShader.shader"] = GL_VERTEX_SHADER;
shaderMap["resources/shaders/BasicFragmentShader.shader"] = GL_FRAGMENT_SHADER;
ShaderLoader shaderLoader;
unsigned int shaderProgram = shaderLoader.createProgram(shaderMap);
// 启用着色器
glUseProgram(shaderProgram);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
// 绘制缓存数据,最后一个参数为总共几个顶点
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
// 删除着色器对象
glDeleteProgram(shaderProgram);