这是OpenGL基础说明,我将每天学习的内容,遇到的问题分享给大家,如果想要看文档请看这里 :https://learnopengl-cn.github.io
1、 使用的语言是c++ 我本身是边学习OpenGL 边熟悉c++
2 、使用xcode开发工具。
3、 glfm 和 glad 是对OpenGL最低限度的接口封装,免去了我们大量重复性工作。
下边就开始搭建环境。
1.安装brew
在终端输入:(我是之前安装过brew 这里只是大概的说明安装流程,没有安过的可以百度一下很多的)
$ gcc --version
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ brew doctor
$brew update
2、安装GLEW和GLFW库
$ brew install glew
$ brew install glfw3
3.下载GLAD库
① 打开GLAD的在线服务:http://glad.dav1d.de 如图设置 OpenGL使用的是3.3 版本 至于为什么使用3.3 请看 https://learnopengl-cn.github.io 这里。
点击生成并下载 glad.zip 并解压
image.png
包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到Include文件夹中(路径"/usr/local/include")(可以使用cmd + shift + g )。
4、新建一个工程
FC10B009-9AA6-4118-A4F7-AE19D479012F.png
删除相关文件如图所示
image.png
5、设置
build setting 找到 header search paths
->添加“/usr/local/include”路径到Header Search Paths
->添加“$(inherited)”
“/usr/local/Cellar/glfw/3.2.1/lib”
“/usr/local/Cellar/glew/2.2.0/lib”路径到Header Search Paths
4.png
Build Phases 找到 Link Binary With Libraries 增加如下内容
image.png
将我们下载的glad.zip 解压的glad.c 文件拖进项目
image.png
新建一个c++ main.cpp 程序 如图
1.png 2.png 3.png
#include <stdio.h>
//glad 一定要在 glfw 上边
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main(){
return 0;
}
cmd +B 编译一下success 表示环境搭建完成。
测试一下:
#include <stdio.h>
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main(int argc, char **argv){
using std::cout; using std::endl;
glfwInit();
// 主版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
// 次版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// 告诉glfw 我们使用的是core_profile 核心模块
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 向前兼容
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 创建一个GLFW 窗口 宽 高 窗口名字 后边两个暂时不用管
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
// 通知GLFW将我们窗口的上下文设置为当前线程的主上下文了
glfwMakeContextCurrent(window);
// GLAD 是用来管理openGL 的函数指针的。所以在调用任何openGL函数之前我们都需要初始化GLAD。
// 我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 创建渲染的视口: 我们必须要告诉OpenGl 需要渲染的尺寸大小,即为视口 viewport(),这样openGL 才能知道根据窗口大小显示数据和坐标。
// glViewport 前两个参数控制视口左下角位置,后两个参数控制视口的宽和高
// openGL 幕后使用的是glViewport 定义的 位置和宽高进行2D转换
glViewport(0, 0, 800, 600);
// 窗口调整的时候 视口应该也被调整 对窗口注册一个回调函数每次窗口大小被调整的时候会被调用
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
// 通过 glfwSetFramebufferSizeCallback glfw 函数 当窗口frame 变化时会调用。
// 对于视网膜屏 Retain 屏 宽度和高度明显比原输入值更高一点。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
void processInput(GLFWwindow *window);
// 为了防止 渲染的图像一出现就退出 我们使用while 循环 。我们可以称之为Render Loop
// glfwWindowShouldClose 每次循环开始前检查一次GLFW 是否被要求退出 是true 的话渲染便结束了。
while(!glfwWindowShouldClose(window))
{
//输出控制
processInput(window);
// glfwSwapBuffers 会交换颜色缓冲(他是存储着GLFW 窗口每一个像素色值的大缓冲),将会作为输出显示在屏幕上
// 当程序退出的时候 使用一个自定义的颜色清空屏幕 在每个新的渲染迭代可是的时候我们总希望清屏否则总是看到上次渲染的结果。
// 我们可以使用glClear GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。 我们清空颜色 。
glClearColor(0.5f, 0.1f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
// glfwPollEvents 检查函数有没有触发什么事件 键盘输入 鼠标移动 并调用对应函数
glfwPollEvents();
}
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow *window)
{
//
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
出现下边界面就表示我们的环境搭建完成
74DB9ED0-D360-4CC0-8439-48C8FC973824.png
网友评论