您的位置:首页 > 运维架构

OpenGL 学习笔记 01 环境配置

2016-06-11 15:17 417 查看

抱歉,本文写的很乱,建议跳过代码部分。

以下教程仅适用于Mac下的Xcode编程环境!其他的我也不会搞。
推荐教程:opengl-tutorial
本项目Github网址

OpenGL太可怕了。。。必需得把学的记下来,不然绝壁忘。

首先贴出代码,然后分析创建一个OpenGL程序都需要什么

//背景颜色
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

//载入并编译shader
GLuint programID = LoadShaders( "/Users/jeff/IDEProjects/xcode_projects/openGL/openGL/vertex.shader", "/Users/jeff/IDEProjects/xcode_projects/openGL/openGL/fragment.shader" );

//VAO
//加速存储效率,储存VBO
//Veretx Array Object
GLuint VertexArrayID;
//创建
glGenVertexArrays(1, &VertexArrayID);
//绑定
glBindVertexArray(VertexArrayID);

//以下创建两个VBO
//Vertex Buffer Object
//用于将数据储存到显存中

//第一个VBO
//储存顶点数据
GLuint vertexbuffer;
//创建
glGenBuffers(1, &vertexbuffer);
//绑定
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
//储存数据
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

//第二个VBO
//储存颜色信息
//操作原理同上
GLuint colorbuffer;
glGenBuffers(1, &colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);

//创建坐标变换矩阵
//本地   ->  世界  -> 视口    ->    齐次剪裁空间       空间变换流程
//     Model    View    Projection                 对应需要的矩阵
//透视变换
mat4 Projection = perspective(radians(70.0f), (float)WIDTH / HEIGHT, 0.1f, 1000.f);
//视口变换
mat4 View = lookAt(vec3(3, 4, 5), vec3(0,0,0), vec3(0,1,0));
//本地变换
mat4 Model = mat4(1.0f);

//集成本地到齐次剪裁空间的转换
mat4 MVP = Projection * View * Model;

//从shader中取出mvp (不是上面的MVP,特地用大小写区分了)
//方便等会传入数据
GLuint MatrixID = glGetUniformLocation(programID, "mvp");

while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && !glfwWindowShouldClose(window)) {
//每次开始时清空画布
//同时清空z-buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//使用shader
glUseProgram(programID);

//把变换矩阵送进shader
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);

//把顶点信息送入shader
//数字0对应vertex shader中的 location = 0
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

//把三角形颜色送入shader
//数字0对应vertex shader中的 location = 1
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

//draw call
glDrawArrays(GL_TRIANGLES, 0, 12 * 3);

//一定要在draw call之后关闭
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

//切换前后缓存,将渲染好的显示出来
glfwSwapBuffers(window);
glfwPollEvents();
}


main

vertex shader:

#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColor;

uniform mat4 mvp;
out vec3 fragmentColor;

void main() {
gl_Position = mvp * vec4(vertexPosition_modelspace, 1);
fragmentColor = vertexColor;
}


fragment shader:

#version 330 core

out vec3 color;
in vec3 fragmentColor;

void main() {
color = fragmentColor;
}


至于这两个shader干嘛的。。。我先学习学习
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: