使用GLFW创建窗口

首先引用头文件

#include <glad/glad.h>
#include <GLFW/glfw3.h>
//注意头文件引用的先后顺序
glfwInit();//设置窗口标识
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//glfw大版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//glfw小版本
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//opengl库
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//在mac平台下需要这样设置windowHandler = glfwCreateWindow(1280, 800, "GLFW created window", nullptr, nullptr);//创建1280*800大小的窗口,同时设定了窗口标题
if(!windowHandler){Debug::GetInstance()->LogE("Creating GLFW window FAIL!", "Window");glfwTerminate();return;
}
//设定当前线程的绘制在刚刚创建的窗口上进行
glfwMakeContextCurrent(windowHandler);//加载opengl库函数
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){Debug::GetInstance()->LogE("GLAD init FAILD", "Window");return;
}//设置viewport大小
glViewport(0, 0, 1280, 800);//设置窗口大小改变事件回调,当窗口的大小被用户改变时回调用_WindowResizeCallBack函数
glfwSetFramebufferSizeCallback(windowHandler, _WindowResizeCallBack);
//窗口大小改变事件回调函数的定义
void _WindowResizeCallBack(GLFWwindow *win, int w, int h){glViewport(0, 0, w, h);
}

定义四边形(两个三角形)

//VAO
unsigned int vao;
glGenVertexArrays(1, &vao);//生成一个vao
glBindVertexArray(vao);//绑定vao//VBO
float vs[] = {//定义四边形的四个点的3d坐标0.5f,  0.5f, 0.0f,  // top right0.5f, -0.5f, 0.0f,  // bottom right-0.5f, -0.5f, 0.0f,  // bottom left-0.5f,  0.5f, 0.0f   // top left
};
unsigned int indices[] = {//定义两个三角形所使用的点,索引vs中的顶点0, 1, 3,   // first triangle1, 2, 3    // second triangle
};
unsigned int vbo;//vbo储存所有顶点信息
glGenBuffers(1, &vbo);//生成一个buffer,并将id储存到vbo中
glBindBuffer(GL_ARRAY_BUFFER, vbo);//将array buffer绑定到vbo
glBufferData(GL_ARRAY_BUFFER, sizeof(vs), vs, GL_STATIC_DRAW);//自动将vs中的顶点数据传输到array buffer所绑定的buffer即vbo中//EBO
unsigned int ebo;//ebo用来储存索引vbo中的信息
glGenBuffers(1, &ebo);//生成一个buffer,并将id储存到ebo中
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);//将element array buffer绑定到ebo中
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//自动将indices中的索引数据传输到element array buffer所绑定的buffer即ebo中//linking vertex attributes
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);//设定第0号顶点信息配置,每个顶点占用3个GL_FLOAT的元素(即3d坐标),同时向量化设为否,一个顶点数据的长度为3 * sizeof(float)
glEnableVertexAttribArray(0);//启用第0号顶点信息配置,这里的编号对应于vertex shader 中的layout(location = 0)
glBindVertexArray(0);//取消绑定vao

加载顶点着色器(vertex shader)和片元着色器(fragment shader)

//vertex shader
//读取顶点着色器源代码
string verString = FileHelper::ReadString(theApp->currentExecutionPath + "/shaders/ver.txt");unsigned int ver = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器
auto verCString = verString.c_str();
Debug::GetInstance()->LogI(verCString, "vertex shader");
glShaderSource(ver, 1, &(verCString), nullptr);//向shader添加源代码
glCompileShader(ver);//编译shaderint success;
char infoLog[512];
glGetShaderiv(ver, GL_COMPILE_STATUS, &success);//获取是否编译成功
if(!success)
{glGetShaderInfoLog(ver, 512, nullptr, infoLog);//获取编译信息Debug::GetInstance()->LogE(infoLog, "Vertex Shader Compile Error");
}//fragment shader
//获取片元着色器源代码
string fragString = FileHelper::ReadString(theApp->currentExecutionPath + "/shaders/frag.txt");unsigned frag = glCreateShader(GL_FRAGMENT_SHADER);//创建片元着色器
auto fragCString = fragString.c_str();
Debug::GetInstance()->LogI(fragCString, "fragment shader");
glShaderSource(frag, 1, &(fragCString), nullptr);//向shader添加源代码
glCompileShader(frag);//编译shaderglGetShaderiv(frag, GL_COMPILE_STATUS, &success);//获取是否编译成功
if(!success)
{glGetShaderInfoLog(frag, 512, nullptr, infoLog);//获取编译信息Debug::GetInstance()->LogE(infoLog, "Fragment Shader Compile Error");
}//shader program
unsigned int shaderProgram = glCreateProgram();//创建一个program
glAttachShader(shaderProgram, ver);//添加顶点着色器
glAttachShader(shaderProgram, frag);//添加片元着色器
glLinkProgram(shaderProgram);//执行链接操作glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);//获取是否链接成功
if(!success)
{glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);//获取链接消息Debug::GetInstance()->LogE(infoLog, "Shader Program Link Error");
}glUseProgram(shaderProgram);//使用programglDeleteShader(ver);//释放顶点着色器
glDeleteShader(frag);//释放片元着色器

绘制定义好的四边形(在循环中执行的渲染过程)

//清屏操作
glClearColor(0.2f, 0.1f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);//设置以线框模式绘制
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glUseProgram(theShaderProgram);//使用之前编译好的shader program
glBindVertexArray(theVAO);//绑定vao,之后的绘制函数都将在绑定的vao上进行
//glDrawArrays(GL_TRIANGLES, 0, 3);//绘制vbo
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);//绘制ebo
//glBindVertexArray(0);//取消绑定vaoglfwSwapBuffers(windowHandler);
glfwPollEvents();

顶点着色器和片元着色器的源代码

Vertex Shader

#version 330 core
layout (location = 0) in vec3 aPos;void main()
{gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

fragment Shader

#version 330 core
out vec4 FragColor;void main()
{FragColor = vec4(0.4f, 0.6f, 0.7f, 1.0f);
}

关于VAO,VBO, EBO

VAO会储存VBO, EBO以及设置好的顶点信息配置。所以在添加VBO和EBO之前,先绑定好VAO。然后在后续的绘制渲染过程仅需要提供VAO即可,VBO,EBO和顶点信息配置都能通过VAO获取。

opengl 创建context_OpenGL学习笔记1-创建窗口,绘制三角形相关推荐

  1. Django:学习笔记(2)——创建第一个应用

    Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...

  2. spring学习笔记02-spring-bean创建的细节问题

    spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...

  3. JavaScript学习笔记:创建、添加与删除节点

    JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...

  4. Python学习笔记:创建分数类

    Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...

  5. Java学习笔记:创建线程的两种方法

    Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程

  6. oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,

    [学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...

  7. openGl新手入门学习笔记(二)下载glew,配置glew的环境与glew的初始化

    这里是一个想要入行游戏行业的平平无奇大学生,希望能够通过写博客来巩固自己学的知识. 一.现代OpenGl 在"openGl新手入门学习笔记(一)"里提到了古典openGl(旧版op ...

  8. OpenGL超级宝典学习笔记——操作矩阵

    为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...

  9. PowerBuilder学习笔记(4)数据窗口(DataWindow)

    PowerBuilder学习笔记(4)数据窗口(DataWindow) 一.数据窗口对象(Object)与数据窗口控件(Control)     数据窗口对象是利用PowerBuilder所提供的数据 ...

最新文章

  1. 2.2.1 处理机调度的概念和层次
  2. 微软发布云端计算机实验室服务 可以让用户存取虚拟机
  3. 动态树算法概述及习题
  4. coreseek java_lnmp+coreseek实现站内全文检索(安装篇)
  5. windows资源监视器
  6. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
  7. ABAP的OPEN CURSOR语法
  8. wordpress实现全站HTTPS
  9. 最好用的超大视频压缩软件
  10. centos虚拟机重启网卡命令
  11. 模型高性能优化 | 两步数据预处理让Alphafold 提速一倍
  12. 基于元胞自动机的城市规划
  13. windows update服务不能正常开启
  14. AndroidRuntimeException: requestFeature() must be called before adding content异常解决办法
  15. 太平洋游戏网暑期PSP权威导购(主机篇)
  16. D92-02-ASEMI低压降款超快恢复二极管
  17. 2018年美国国内高校排名
  18. 《微波原理与技术》学习笔记5波导理论-微波传输线
  19. maven打包报错-There are test failures
  20. NULL和‘‘,存储空间优化

热门文章

  1. tensorflow训练打游戏ai
  2. Java 代理(proxy)模式
  3. IntelliJ IDEA 2016.3.1 学习git 码云插件 学习笔记
  4. js的eval函数解析后台返回的json数据时为什加上圆括号eval((+data+)),而HTML页面定义的数据不用...
  5. js高级程序设计(六)面向对象
  6. DOM笔记(五):JavaScript的常见事件和Ajax小结
  7. MySQL优化篇:慢查询日志
  8. 阿里某程序员爆料:面试一个重庆小伙子,却被对方微信调戏!
  9. 万字长文,结合电商支付业务一文搞懂DDD
  10. 从 Servlet 入手带你看架构和框架设计的套路