OpenGL 学习笔记 01

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

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

  1 #include <cstdio>
  2 #include <cstdlib>
  3
  4 #include <GL/glew.h>
  5
  6 #include <GLFW/glfw3.h>
  7
  8 #include <glm/glm.hpp>
  9 #include <glm/gtc/matrix_transform.hpp>
 10 using namespace glm;
 11 using namespace std;
 12
 13 #include <shader.hpp>
 14 #include <shader.cpp>
 15
 16 static const GLfloat g_vertex_buffer_data[] = {
 17     -1.0f,-1.0f,-1.0f, // triangle 1 : begin
 18     -1.0f,-1.0f, 1.0f,
 19     -1.0f, 1.0f, 1.0f, // triangle 1 : end
 20     1.0f, 1.0f,-1.0f, // triangle 2 : begin
 21     -1.0f,-1.0f,-1.0f,
 22     -1.0f, 1.0f,-1.0f, // triangle 2 : end
 23     1.0f,-1.0f, 1.0f,
 24     -1.0f,-1.0f,-1.0f,
 25     1.0f,-1.0f,-1.0f,
 26     1.0f, 1.0f,-1.0f,
 27     1.0f,-1.0f,-1.0f,
 28     -1.0f,-1.0f,-1.0f,
 29     -1.0f,-1.0f,-1.0f,
 30     -1.0f, 1.0f, 1.0f,
 31     -1.0f, 1.0f,-1.0f,
 32     1.0f,-1.0f, 1.0f,
 33     -1.0f,-1.0f, 1.0f,
 34     -1.0f,-1.0f,-1.0f,
 35     -1.0f, 1.0f, 1.0f,
 36     -1.0f,-1.0f, 1.0f,
 37     1.0f,-1.0f, 1.0f,
 38     1.0f, 1.0f, 1.0f,
 39     1.0f,-1.0f,-1.0f,
 40     1.0f, 1.0f,-1.0f,
 41     1.0f,-1.0f,-1.0f,
 42     1.0f, 1.0f, 1.0f,
 43     1.0f,-1.0f, 1.0f,
 44     1.0f, 1.0f, 1.0f,
 45     1.0f, 1.0f,-1.0f,
 46     -1.0f, 1.0f,-1.0f,
 47     1.0f, 1.0f, 1.0f,
 48     -1.0f, 1.0f,-1.0f,
 49     -1.0f, 1.0f, 1.0f,
 50     1.0f, 1.0f, 1.0f,
 51     -1.0f, 1.0f, 1.0f,
 52     1.0f,-1.0f, 1.0f
 53 };
 54
 55 //每个顶点一个颜色
 56 static const GLfloat g_color_buffer_data[] = {
 57     0.583f,  0.771f,  0.014f,
 58     0.609f,  0.115f,  0.436f,
 59     0.327f,  0.483f,  0.844f,
 60     0.822f,  0.569f,  0.201f,
 61     0.435f,  0.602f,  0.223f,
 62     0.310f,  0.747f,  0.185f,
 63     0.597f,  0.770f,  0.761f,
 64     0.559f,  0.436f,  0.730f,
 65     0.359f,  0.583f,  0.152f,
 66     0.483f,  0.596f,  0.789f,
 67     0.559f,  0.861f,  0.639f,
 68     0.195f,  0.548f,  0.859f,
 69     0.014f,  0.184f,  0.576f,
 70     0.771f,  0.328f,  0.970f,
 71     0.406f,  0.615f,  0.116f,
 72     0.676f,  0.977f,  0.133f,
 73     0.971f,  0.572f,  0.833f,
 74     0.140f,  0.616f,  0.489f,
 75     0.997f,  0.513f,  0.064f,
 76     0.945f,  0.719f,  0.592f,
 77     0.543f,  0.021f,  0.978f,
 78     0.279f,  0.317f,  0.505f,
 79     0.167f,  0.620f,  0.077f,
 80     0.347f,  0.857f,  0.137f,
 81     0.055f,  0.953f,  0.042f,
 82     0.714f,  0.505f,  0.345f,
 83     0.783f,  0.290f,  0.734f,
 84     0.722f,  0.645f,  0.174f,
 85     0.302f,  0.455f,  0.848f,
 86     0.225f,  0.587f,  0.040f,
 87     0.517f,  0.713f,  0.338f,
 88     0.053f,  0.959f,  0.120f,
 89     0.393f,  0.621f,  0.362f,
 90     0.673f,  0.211f,  0.457f,
 91     0.820f,  0.883f,  0.371f,
 92     0.982f,  0.099f,  0.879f
 93 };
 94
 95 int main() {
 96     if(!glfwInit()) {
 97         fprintf(stderr, "Failed To init OpenGL\n");
 98     }
 99
100     // We want OpenGL 3.3
101     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
102     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
103     // To make MacOS happy; should not be needed
104     glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
105     glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don‘t want the old OpenGL
106
107     // Open a window and create its OpenGL context
108     // (In the accompanying source code, this variable is global)
109     GLFWwindow* window;
110     window = glfwCreateWindow(800, 600, "Tutorial 01", NULL, NULL);
111     if( window == NULL ){
112         fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
113         glfwTerminate();
114         return -1;
115     }
116     glfwMakeContextCurrent(window); // Initialize GLEW
117     glewExperimental = true; // Needed in core profile
118
119     //z-buffer
120     glEnable(GL_DEPTH_TEST);
121     glDepthFunc(GL_LEFT);
122
123     if (glewInit() != GLEW_OK) {
124         fprintf(stderr, "Failed to initialize GLEW\n");
125         return -1;
126     }
127
128     //背景颜色
129     glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
130
131     //shader
132     GLuint programID = LoadShaders( "/Users/jeff/IDEProjects/xcode_projects/openGL/openGL/vertex.shader", "/Users/jeff/IDEProjects/xcode_projects/openGL/openGL/fragment.shader" );
133
134     GLuint VertexArrayID;
135     glGenVertexArrays(1, &VertexArrayID);
136     glBindVertexArray(VertexArrayID);
137
138     //vertex buffer
139     GLuint vertexbuffer;
140     glGenBuffers(1, &vertexbuffer);
141     glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
142     glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
143
144     //color buffer
145     GLuint colorbuffer;
146     glGenBuffers(1, &colorbuffer);
147     glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
148     glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);
149
150     mat4 Projection = perspective(radians(70.0f), (float)4/3, 0.1f, 1000.f);
151
152     mat4 View = lookAt(vec3(3, 4, -5), vec3(0,0,0), vec3(0,1,0));
153
154     mat4 Model = mat4(1.0f);
155
156     //模型到投影转换
157     mat4 mvp = Projection * View * Model;
158
159     GLuint MatrixID = glGetUniformLocation(programID, "mvp");
160
161     while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && !glfwWindowShouldClose(window)) {
162         //每次开始时清空画布
163         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
164
165         //使用shader
166         glUseProgram(programID);
167
168         //把变换矩阵送进shader
169         glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);
170
171         //画三角形
172         glEnableVertexAttribArray(0);
173         glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
174         glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
175
176         //三角形颜色
177         glEnableVertexAttribArray(1);
178         glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
179         glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
180
181         //draw call
182         glDrawArrays(GL_TRIANGLES, 0, 12 * 3);
183
184         glDisableVertexAttribArray(0);
185         glDisableVertexAttribArray(1);
186
187         glfwSwapBuffers(window);
188         glfwPollEvents();
189     }
190     glfwTerminate();
191     return 0;
192 }

Code

时间: 2024-10-11 10:56:59

OpenGL 学习笔记 01的相关文章

【opengl 学习笔记01】HelloWorld示例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比较踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

【OpenGL 学习笔记01】HelloWorld演示样例

<<OpenGL Programming Guide>>这本书是看了忘,忘了又看,赶脚还是把笔记做一做心里比較踏实,哈哈. 我的主题是,好记性不如烂笔头. ================================================================ 1. 下载glut库 glut库地址为:www.opengl.org/resources/libraries/glut/glutdlls37beta.zip glut全称为:OpenGL Utilit

【OpenGL 学习笔记02】宽点画线

我们要知道,有三种绘图操作是最基本的:清除窗口,绘制几何图形,绘制光栅化对象. 光栅化对象后面再解释. 1.清除窗口 比如我们可以同时清除颜色缓冲区和深度缓冲区 glClearColor (0.0, 0.0, 0.0, 0.0);//指定颜色缓冲区清除为黑色 glClearDepth(1.0);//指定深度缓冲区的清除值为1.0 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//指定要清除的缓冲区并清除 2.绘制几何图形 先要设置绘制颜色,

OpenGL学习笔记:拾取与选择

转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当前鼠标的位置是哪一个物体呢? OpenGL有一套机制,叫做Picking, 里面涉及到几个核心概念: 1. selection mode. 选择模式 2. name stack. 名字栈 3. hit record. 命中记录 4. viewing volume. 视角范围 在OpenGL的pick

HTTP 学习笔记01

HTTP   hypertext transfer protocol (超文本传输协议) TCP/IP 协议集中的一个应用层协议 用于定义WEB浏览器与WEB服务器之间交换数据的过程以及数据本身的格式 HTTP 1.0  会话方式 HTTP 1.1 方式 HTTP 请求消息结构 一个请求行,若干消息头,以及实体内容 其中的一些消息头和实体内容都是可选的,消息头和实体内容之间要用空行隔开. GET   方式下是没有实体内容的 POST .PUT.DELETE 方式下请求消息才可以包含实体内容 HT

SWIFT学习笔记01

1.Swift,用来判断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }else{ greeting = "else===" } 2.运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break. 3.//使用..创建的范围不包含上界,如果想包含的话需要使用...,集合上,就是[)与[]的关系 for i

C++ GUI Qt4学习笔记01

C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概念:一个是“信号和槽”,另一个是“布局”. 窗口部件(widget)是用户界面的一个可视化元素,相当于windows系统中的“控件”和“容器”.任意窗口部件都可以用作窗口. 1.1Hello Qt 正确安装Qt4开发环境,创建工程目录hello,源代码文件名为hello.cpp,进入hello目录 (1

OpenGL学习笔记3 —— 绘制3D物体、鼠标交互、反向变换

/* reference http://nehe.gamedev.net/article/using_gluunproject/16013/ */ #include <windows.h> // windows系统要加这个.因为下面2个头文件的一些宏是在这个文件中定义的 #include <gl/Gl.h> #include <gl/glut.h> //这两个头文件在OpenGL程序中几乎必加. #include <cstdio> //标准输入输出,用来打印

【OpenGL 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g