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干嘛的。。。我先学习学习
相关文章推荐
- Ubuntu Linux下搜狗输入法的安装教程
- Linux内核---多线程
- Apache的对象池化工具commons-pool
- MacOS下Myeclipse启动Tomcat控制台出现乱码的解决方法
- MacOS下Myeclipse启动Tomcat控制台出现乱码的解决方法
- JAVA利用Apache Poi读取Excel文件
- CentOS7 Yum方式安装MySQ
- centos7下安装php7
- Hadoop之HDFS文件操作
- bash文件测试符
- Linux基础命令-echo、ls
- OpenJudge 2253:Frogger
- openwrt config_gen Makefile
- CentOS与win共用一个蓝牙鼠标
- linux命令常用命令
- Linux Top 命令解析
- Linux下which、whereis、locate、find 命令的区别
- Shell脚本编程之引号
- 日志文件详解log4j.properties
- linux下"没有设置 SVN_EDITOR...."错误解决方法