给自己看的OpenGL基础入门教学

OpenGL是一个巨大的状态机(上下文),里面又包含很多个子状态机(上下文),他整个的工作机理就是通过特定的函数来操作上下文中的某些状态,然后利用缓存将这些状态与GPU进行交互。

1.glfw开头的函数

// GLFW内函数的初始化
glfwInit();					
//中止glfw函数
glfwTerminate();

// 配置GLFW   内置的可设置项在这个网站里面:http://www.glfw.org/docs/latest/window.html#window_hints
glfwWindowHint();

// 创建一个800x600的窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);

//将窗口调整事件与回调函数绑定
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

//检查窗口是否需要关闭
glfwWindowShouldClose(window);
//设置WindowShouldClose这个属性的值
glfwSetWindowShouldClose(window, true);

//交换前后缓冲器中的数据(牵扯到双缓冲的问题)
glfwSwapBuffers(window);

//检查鼠标、键盘等事件的触发,并触发其对应的回调函数
glfwPollEvents();

//获取键盘事件
glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS
    

2.glad开头的函数

//在调用OpenGL的任何指针前,都需要初试话Glad,方式如下
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize GLAD" << std::endl;
    return -1;
}

3.gl开头的函数

glViewport(0, 0, 800, 600); //设置窗口的维度大小

//清空颜色缓冲,并设定清空后的颜色填充
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

//开辟一个缓存器内存地址
glGenBuffers(1, &VBO);

//将VBO设定为GL_ARRAY_BUFFER的缓冲类型
glBindBuffer(GL_ARRAY_BUFFER, VBO);  

//将这一个VAO中存储的VBO顶点数据发送到GPU中
//GL_ARRAY_BUFFER:VBO数据
//GL_ELEMENT_ARRAY_BUFFER:EBO数据
//GL_STATIC_DRAW :数据不会或几乎不会改变。
//GL_DYNAMIC_DRAW:数据会被改变很多。
//GL_STREAM_DRAW :数据每次绘制时都会改变。
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

//创建一个着色器
//顶点着色器:GL_VERTEX_SHADE
//片段着色器:GL_FRAGMENT_SHADER
vertexShader = glCreateShader(GL_VERTEX_SHADER);
//加载着色器源码到着色器对象上
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
//编译着色器上的源码
glCompileShader(vertexShader);
//检查是否编译成功
int  success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if(!success)
{
    glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
    std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}

//着色器程序
//创建
shaderProgram = glCreateProgram();
//在着色器程序上加载两个着色器
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
//编译链接这两个着色器
glLinkProgram(shaderProgram);
//使用
glUseProgram(shaderProgram);
//检查是否创建成功
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
    glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
    ...
}

//解析顶点数据(解析的哪些数据取决于你在本个VAO中加载的顶点的数据)
//第一个参数对应GLSL中的index  ''layout(location==index)''
//解析位置数据
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//解析纹理数据
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)3);
glEnableVertexAttribArray(1);

//绑定(切换)到(这个)VAO
glBindVertexArray(VAO);
//解绑(跳出)(这个)VAO
glBindVertexArray(0);

//绘制元素
//GL_TRIANGLES、GL_POINTS、GL_LINES:三种基础的图元模式 三角形、点、线
//从VBO数据绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
//从EBO数据绘制正方形
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

//获取shaderProgram这个着色器程序中的uniform变量"ourColor"的唯一索引值
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
//显示的更改shaderProgram中的"ourColor"值
glUseProgram(shaderProgram);
glUniform4f(vertexCo
NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第38课 从… NeHe的OPENGL中文教程:第37课 卡… 愚人节十大IT假新闻:Opera浏览器… NeHe的OPENGL中文教程:第36课 放… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第34课 从… NeHe的OPENGL中文教程:第33课 加… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第31课 模… NEHE的OPENGL中文教程:第30课 碰… NEHE的OPENGL中文教程:第30课 碰… NeHe的OPENGL中文教程:第29课 Bli… NeHe的OPENGL中文教程:第28课 贝… NeHe的OPENGL中文教程:第27课 影… NeHe的OPENGL中文教程:第26课剪裁… NeHe的OPENGL中文教程:第25课 变… NeHe的OPENGL中文教程:第24课 TAG… NeHe的OPENGL中文教程:第23课 球… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第20课 蒙… NeHe的OPENGL中文教程:第19课 粒… NeHe的OPENGL中文教程:第18课 二… NeHe的OPENGL中文教程:第17课 2D… NeHe的OPENGL中文教程:第16课 雾 NeHe的OPENGL中文教程:第15课 图… NeHe的OPENGL中文教程:第14课 图… NeHe的OPENGL中文教程:第13课 位… NeHe的OPENGL中文教程:第12课 显… NeHe的OPENGL中文教程:第11课 飘… NeHe的OPENGL中文教程:第十课 漫… NeHe的OPENGL中文教程:第九课 漂… NeHe的OPENGL中文教程:第八课 Alp… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第六课 纹… NeHe的OPENGL中文教程:第五课 向3… NeHe的OPENGL中文教程:第四课 旋… NeHe的OPENGL中文教程:第三课 着… NeHe的OPENGL中文教程:第二课 多… NeHe的OPENGL中文教程:第一课 新… NeHe的OPENGL中文教程:第一课 新… DirectX与OpenGL方面的经典电子书… VC++ 6.0下OpengGL配置以及glut配… 怎样开始学习OpenGL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RivenRussell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值