OpenGL 入门第一课 视窗以及三角形
生活随笔
收集整理的这篇文章主要介绍了
OpenGL 入门第一课 视窗以及三角形
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
请查看课件教程
下面是我粗劣画的过程图
下面是课件中的过程图
下面是未使用索引缓冲对象(EBO)的
#define GLEW_STATIC // 这个一定要加不然报错 静态链接库 #include<iostream> #include<GL/glew.h> #include<GLFW/glfw3.h> using namespace std; void processInput(GLFWwindow); void processInput(GLFWwindow* window) {//如果键盘输入esc 则触发 退出if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {// 设置 要求退出glfwSetWindowShouldClose(window, true);} } // 逆时针方向绘制 默认情况下,逆时针的顶点连接顺序被定义为三角形的正 // 逆时针或顺时针都是相对于观察者方向的 float vertices[] = {-0.5f, 0.5f, 0.0f, // 左上角0.5f, -0.5f, 0.0f, // 右下角0.5f, 0.5f, 0.0f, // 右上角// 第二个三角形0.5f, -0.5f, 0.0f, // 右下角-0.5f, -0.5f, 0.0f, // 左下角-0.5f, 0.5f, 0.0f // 左上角 };const char* vertexShaderSource = "#version 330 core \n" "layout (location = 0) in vec3 aPos; \n" "void main() \n" "{ \n" " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n" "} \n"; const char* fragmentShaderSource = "#version 330 core \n" "out vec4 FragColor; \n" "void main() \n" "{ \n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "} \n";int main() {// 初始化GLFWglfwInit();// 提示 我们使用的版本是3.3// 主版本glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// 次版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// 简介glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow* window = glfwCreateWindow(800, 600, "Test window", NULL, NULL);if (window == NULL) {cout << "open window failed." << endl;// 终止 glfwglfwTerminate();}// 绑定window到上下文对象 创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了glfwMakeContextCurrent(window);glewExperimental = true;// GLEW_OK 0//init GLEWif (glewInit() != GLEW_OK) {cout << "glew init failed." << endl;// 终止 glfwglfwTerminate();return -1;}// OpenGL渲染窗口的尺寸大小 // glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)glViewport(0, 0, 800, 600);// 设置剔除 (opegl默认正面背面都显示(不剔除))glEnable(GL_CULL_FACE);// 剔除背面 GL_BACK 剔除正面 GL_FRONTglCullFace(GL_BACK);//VAO对象unsigned int VAO;// 生成一个VAO对象 这个方法可以生成多个 由第一个参数决定glGenVertexArrays(1, &VAO);// 绑定 VAOglBindVertexArray(VAO);unsigned int VBO; //如果多个可以用 VBO[]数组 这个方法可以生成多个 由第一个参数决定glGenBuffers(1, &VBO);//将新创建的缓冲绑定到 GL_ARRAY_BUFFER目标上glBindBuffer(GL_ARRAY_BUFFER, VBO);// glBufferData 是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数// GL_STATIC_DRAW 数据不会或几乎不会改变。glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 编译着色器unsigned int vertexShader;// 创建这个着色器vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);// 编译glCompileShader(vertexShader);// 片段着色器unsigned int fragmentShader;// 创建这个着色器fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);// 编译glCompileShader(fragmentShader);// 着色器程序 是将多个着色器合并之后并最终链接完成的版本unsigned int shaderProgram;// 创建一个着色器程序对象shaderProgram = glCreateProgram();// 将之前编译的着色器附加到程序对象上glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);// 用glLinkProgram链接它们glLinkProgram(shaderProgram);// glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)// 从 0位 开始 将数据每三个为一组 单位为float 每次跳3*float字节 偏移为0glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);// 以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的glEnableVertexAttribArray(0);//渲染循环 ,它能在我们让GLFW退出前一直保持运行。下面几行的代码就实现了一个简单的渲染循环://glfwWindowShouldClose 我们每次循环的开始前检查一次GLFW是否被要求退出while (!glfwWindowShouldClose(window)) {//自定义事件 当键盘触发esc 退出processInput(window);glClearColor(0.2, 0.3, 0.3, 1.0);// GL_COLOR_BUFFER_BIT 颜色,GL_DEPTH_BUFFER_BIT 深度 和 GL_STENCIL_BUFFER_BIT 模板// 清除前面的那一帧的颜色glClear(GL_COLOR_BUFFER_BIT);// 绑定 VAO glBindVertexArray(VAO);glUseProgram(shaderProgram);// 画三角形 从0开始 绘制三个顶点 和VBO的顶点数据(通过VAO间接绑定)来绘制图元glDrawArrays(GL_TRIANGLES, 0, 6);//解绑VAOglBindVertexArray(0);glfwSwapBuffers(window);glfwPollEvents();}// 最后终止 glfwglfwTerminate();return 0; }未剔除背面
剔除背面
使用EBO的
使用线框模式
加上下面那行代码就变成线框模式了
glViewport(0, 0, 800, 600);// 设置剔除 (opegl默认正面背面都显示(不剔除))glEnable(GL_CULL_FACE);// 剔除背面 GL_BACK 剔除正面 GL_FRONTglCullFace(GL_BACK);// 线框模式 //第一个参数表示我们打算将其应用到所有的三角形的正面和背面,第二个参数告诉我们用线来绘制glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);效果
判断正背面
处理背面剔除有两个需要参考的依据,一个是正背面判断,一个是观察者位置
正背面判断:在OpenGL中默认是逆时针打点的为正面,顺时针为侧面。
总结
以上是生活随笔为你收集整理的OpenGL 入门第一课 视窗以及三角形的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 关于map对key自定义排序
- 下一篇: iframe父页面与子页面之间的元素获取