opengl 创建context_OpenGL学习笔记1-创建窗口,绘制三角形
![](/assets/blank.gif)
使用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
![](/assets/blank.gif)
VAO会储存VBO, EBO以及设置好的顶点信息配置。所以在添加VBO和EBO之前,先绑定好VAO。然后在后续的绘制渲染过程仅需要提供VAO即可,VBO,EBO和顶点信息配置都能通过VAO获取。
opengl 创建context_OpenGL学习笔记1-创建窗口,绘制三角形相关推荐
- Django:学习笔记(2)——创建第一个应用
Django:学习笔记(2)--创建第一个应用 创建应用 在 Django 中,每一个应用都是一个 Python 包,并且遵循着相同的约定.Django 自带一个工具,可以帮你生成应用的基础目录结构, ...
- spring学习笔记02-spring-bean创建的细节问题
spring学习笔记02-spring-bean创建的细节问题 三种创建Bean对象的方式 Bean的作用范围 Bean的生命周期 <?xml version="1.0" e ...
- JavaScript学习笔记:创建、添加与删除节点
JavaScript学习笔记:创建.添加与删除节点 文章目录 JavaScript学习笔记:创建.添加与删除节点 一.DOM对象节点类型 二.创建节点 1.创建元素节点 2.创建文本节点 3.创建属性 ...
- Python学习笔记:创建分数类
Python学习笔记:创建分数类 1.编写创建分数类.py # 创建分数类from math import gcd# 定义分数类 class Fraction: def __init__(self, ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
- oracle 创建角色 权限设置,[学习笔记] Oracle创建用户、分配权限、设置角色,
[学习笔记] Oracle创建用户.分配权限.设置角色, 创建用户 create user student --用户名 identified by "123456" --密码 de ...
- openGl新手入门学习笔记(二)下载glew,配置glew的环境与glew的初始化
这里是一个想要入行游戏行业的平平无奇大学生,希望能够通过写博客来巩固自己学的知识. 一.现代OpenGl 在"openGl新手入门学习笔记(一)"里提到了古典openGl(旧版op ...
- OpenGL超级宝典学习笔记——操作矩阵
为了更强大的功能和灵活性,我们有时需要直接操作矩阵.在OpenGL中4x4的矩阵用包含16个浮点数值的一维数组来表示,而不是用二维的4x4的数组来表示.OpenGL之所以这么做,因为使用一维数组更高效 ...
- PowerBuilder学习笔记(4)数据窗口(DataWindow)
PowerBuilder学习笔记(4)数据窗口(DataWindow) 一.数据窗口对象(Object)与数据窗口控件(Control) 数据窗口对象是利用PowerBuilder所提供的数据 ...
最新文章
- 2.2.1 处理机调度的概念和层次
- 微软发布云端计算机实验室服务 可以让用户存取虚拟机
- 动态树算法概述及习题
- coreseek java_lnmp+coreseek实现站内全文检索(安装篇)
- windows资源监视器
- Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码
- ABAP的OPEN CURSOR语法
- wordpress实现全站HTTPS
- 最好用的超大视频压缩软件
- centos虚拟机重启网卡命令
- 模型高性能优化 | 两步数据预处理让Alphafold 提速一倍
- 基于元胞自动机的城市规划
- windows update服务不能正常开启
- AndroidRuntimeException: requestFeature() must be called before adding content异常解决办法
- 太平洋游戏网暑期PSP权威导购(主机篇)
- D92-02-ASEMI低压降款超快恢复二极管
- 2018年美国国内高校排名
- 《微波原理与技术》学习笔记5波导理论-微波传输线
- maven打包报错-There are test failures
- NULL和‘‘,存储空间优化
热门文章
- tensorflow训练打游戏ai
- Java 代理(proxy)模式
- IntelliJ IDEA 2016.3.1 学习git 码云插件 学习笔记
- js的eval函数解析后台返回的json数据时为什加上圆括号eval((+data+)),而HTML页面定义的数据不用...
- js高级程序设计(六)面向对象
- DOM笔记(五):JavaScript的常见事件和Ajax小结
- MySQL优化篇:慢查询日志
- 阿里某程序员爆料:面试一个重庆小伙子,却被对方微信调戏!
- 万字长文,结合电商支付业务一文搞懂DDD
- 从 Servlet 入手带你看架构和框架设计的套路