
OPenGL
文章平均质量分 84
记录OPenGL的学习过程
贝勒里恩
用生命写代码,用灵魂做界面!
展开
-
跟着LearnOpenGL学习12--光照贴图
在跟着LearnOpenGL学习11–材质中,我们讨论了让每个物体都拥有自己独特的材质从而对光照做出不同的反应的方法。这样子能够很容易在一个光照的场景中给每个物体一个独特的外观,但是这仍不能对一个物体的视觉输出提供足够多的灵活性。我们将整个物体的材质定义为一个整体,但现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成。想想一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那么有光泽,所以它没有镜面高光,轮毂非常闪亮(如果你洗车了的话)。原创 2023-12-26 16:28:18 · 1400 阅读 · 0 评论 -
跟着LearnOpenGL学习11--材质
在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter),因而产生较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的高光点。如果我们想要在OpenGL中模拟多种类型的物体,我们必须针对每种表面定义不同的材质(Material)属性。在跟着LearnOpenGL学习10–基础光照这一篇中,我们定义了一个物体和光的颜色,并结合环境光与镜面强度分量,来决定物体的视觉原创 2023-12-26 13:00:37 · 1309 阅读 · 0 评论 -
跟着LearnOpenGL学习10--基础光照
现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。因此OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。环境光照(Ambient):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。原创 2023-12-25 10:45:22 · 996 阅读 · 0 评论 -
跟着LearnOpenGL学习9--光照
现在,如果我们使用绿色的光源又会发生什么呢?原创 2023-12-22 15:26:56 · 1004 阅读 · 0 评论 -
跟着LearnOpenGL学习8--摄像机
前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景(我们向后移动了一点)。OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。本节我们将会讨论如何在OpenGL中配置一个摄像机,并且将会讨论FPS风格的摄像机,让你能够在3D场景中自由移动。我们也会讨论键盘和鼠标输入,最终完成一个自定义的摄像机类。当我们讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作原创 2023-06-13 15:59:26 · 978 阅读 · 0 评论 -
跟着LearnOpenGL学习7--坐标系统
OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将这些坐标变换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标或像素。原创 2023-06-07 11:33:36 · 949 阅读 · 0 评论 -
跟着LearnOpenGL学习6--变换
尽管我们现在已经知道了如何创建一个物体、着色、加入纹理,给它们一些细节的表现,但因为它们都还是静态的物体,仍是不够有趣。我们可以尝试着在每一帧改变物体的顶点并且重配置缓冲区从而使它们移动,但这太繁琐了,而且会消耗很多的处理时间。我们现在有一个更好的解决方案,使用(多个)矩阵(Matrix)对象可以更好的变换(Transform)一个物体。矩阵是一种非常有用的数学工具,尽管听起来可能有些吓人,不过一旦你理解了它们后,它们会变得非常有用。为了深入了解变换,我们首先要在讨论矩阵之前进一步了解一下向量。原创 2023-06-05 17:48:18 · 1216 阅读 · 0 评论 -
跟着LearnOpenGL学习5--纹理
通过前面着色器博文的学习,我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。为了解决这一问题,我们可以使用纹理,纹理是一个2D图片(甚至也有1D和3D的纹理),纹理可以理解为贴图,将图片贴到我们创建的几何图形上。你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。原创 2023-06-01 15:56:29 · 1393 阅读 · 0 评论 -
跟着LearnOpenGL学习4--着色器
在之前绘制三角形的博文中,我们已经接触到了着色器,但是肯定有许多疑问,本文来详细了解一下着色器!着色器(Shader)是运行在GPU上的小程序,这些小程序为图形渲染管线的某个特定部分而运行;从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。原创 2023-05-12 16:45:13 · 1391 阅读 · 1 评论 -
跟着LearnOpenGL学习3--四边形绘制
通过一文,我们已经知道了怎么配置渲染管线,来绘制三角形;OpenGL主要处理三角形,当我们需要绘制别的图形时,例如:四边形,应当用三角形去拼接,组成我们想要的四边形;原创 2023-05-11 13:59:54 · 1193 阅读 · 0 评论 -
跟着LearnOpenGL学习2--三角形绘制
在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线管理的。第一部分把你的3D坐标转换为2D坐标;第二部分是把2D坐标转变为实际的有颜色的像素;原创 2023-05-11 12:19:22 · 1091 阅读 · 0 评论 -
跟着LearnOpenGL学习1--环境搭建
LearnOpenGL网站上采用的是GLFW这个库来进行OpenGL开发,所以我们需要配置GLFW和Glad;由于本人更习惯使用Qt Creator进行开发,所以后面的都是在Qt平台上进行写代码!原创 2023-05-10 16:00:11 · 810 阅读 · 0 评论 -
OPenGL学习--库介绍
OpenGL被定义为 “图形硬件的一种软件接口”;从本质上讲,它是一个3D图形和模型库,具有高度的可移植性,并且具有非常快的速度;使用OpenGL,可以创建爱你优雅而漂亮的3D图像,并且具有非常出色的视觉质量;使用OpenGL的最大有点是它的速度远远快于光线追踪器或软件渲染引擎;原创 2023-05-08 16:38:38 · 5029 阅读 · 0 评论 -
OPenGL笔记--术语
将数学和图形数据转换成3D空间图像的操作;原创 2023-05-08 12:27:12 · 958 阅读 · 0 评论 -
OPenGL笔记--创建一个OPenGL窗口
一、效果展示二、详细代码工程文件QT += core gui openglgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use# any Qt feature that has been marked deprecated (the exact warnings# d原创 2022-03-22 18:00:07 · 2949 阅读 · 0 评论 -
OPenGL笔记--创建一个多边形
一、前置知识通过上一节的学习:OPenGL笔记–创建一个OPenGL窗口,我们已经知道了怎么创建一个OPenGL窗口了,接下来学习如果在OPenGL窗口中绘制多边形。首先我们先了解一下OPenGL中的坐标系:OPenGL中的坐标系如上图所示,X坐标轴从左至右、Y坐标轴从下至上、Z坐标轴从里至外;OPenGL屏幕中心的坐标值是X和Y轴上的0.0点,一般调用glLoadIdentity()就会将当前点移到屏幕中心;使用glTranslatef(x, y, z)沿着X,Y和Z轴移动,并不是相对于屏幕原创 2022-03-23 10:21:31 · 1130 阅读 · 0 评论 -
OPenGL笔记--给多边形上色
一、前置知识OPenGL中上色分为:单调着色、平滑着色单调着色:给四边形图上固定的一种颜色;平滑着色:给三角形的三个顶点的不同颜色混合在一起,创建漂亮的色彩混合;使用glColor3f(r, g, b)来设置当前画笔颜色二、运行效果三、具体代码完整代码可参考:OPenGL笔记–创建一个OPenGL窗口void GL_Test::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深原创 2022-03-23 10:45:47 · 1164 阅读 · 0 评论 -
OPenGL笔记--多边形旋转
一、前置知识OPenGL中使用glRotatef(Angle, Xvector, Yvector, Zvector)来让对象绕某个轴旋转Angle:通常是个变量,导表对象转过的角度;Xvector, Yvector, Zvector:共同决定对象旋转的方向;(1,0,0)表示绕着X轴旋转、 (0,1,0)表示绕着Y轴旋转、 (0,0,1)表示绕着Z轴旋转;二、运行效果三、关键代码void GL_Test::paintGL(){ glClear(GL_COLOR_BUFFER原创 2022-03-23 11:26:32 · 1916 阅读 · 0 评论 -
OPenGL笔记--创建三维图形(立方体)
一、前置知识通过之前的学习,我们已经知道了如何创建多边形,立方体实际就是多边形围起来的三维图形,例如:椎体是4个三角形围起来的三维图形;正方体是6个正方形围起来的三维图形;注意事项:要让您的对象绕自身的轴旋转,您必须让对象的中心坐标总是( 0.0, 0,0, 0,0 );在绘制时多边形时,要么都逆时针,要么都顺时针,但永远不要将两种次序混在一起;在绘制三角形时,开始-结束中有多余的点,OPenGL会理解为要绘制新的三角形,不会绘制成多边形;二、运行效果三、具体代码完整代码原创 2022-03-23 12:13:14 · 10073 阅读 · 0 评论 -
OPenGL笔记--给立方体贴图(纹理)
一、前置知识经过前面的学习,我们已经知道了立方体怎么创建了,接下来学习怎么给立方体贴图;为了将纹理正确的映射到四边形上,您必须:将纹理的 右上角 映射到四边形的 右上角 ;纹理的 左上角 映射到四边形的 左上角 ;纹理的 右下角 映射到四边形的 右下角 ;纹理的 左下角 映射到四边形的 左下角 ;如果映射错误的话,图像显示时可能上下 颠倒,侧向一边或者什么都不是glTexCoord2f(x, y):第一个参数是X坐标;0.0 是纹理的左侧、0.5 是纹理的中点、 1.0 是纹理的原创 2022-03-23 15:16:34 · 3510 阅读 · 3 评论 -
OPenGL笔记--纹理滤波和光源
一、前置知识光源环境光:环境光来自四面八方;所有场景中的对象都处于环境光的照射中;如果没有环境光,未被漫射光照到的地方就会变得十分黑暗;漫射光:由特定的光源产生,并在场景中的对象表明上产生反射;处于漫射光直接照射下的任何对象表明都变得很亮,而几乎未被照射到的区域就显得要暗一些;GLfloat lightAmbient[4] = {0.5, 0.5, 0.5, 1.0}; //半亮(0.5)的白色环境光,四个参数分别是r、、g、b、aGLfloat lightDiffuse[4] = {原创 2022-03-24 11:30:03 · 822 阅读 · 0 评论 -
OpenGL笔记--融合
一、前置知识二、运行效果三、完整代码#ifndef GL_TEST_H#define GL_TEST_H#include <qgl.h> //因为QGLWidget类被包含在qgl.h头文件中#include <glut.h> //使用glut库中的API#include <QKeyEvent>#include <QTimer>//继承QGLWidget得到OPenGL窗口部件类class GL_Test原创 2022-03-31 14:58:37 · 1357 阅读 · 1 评论 -
OPenGL笔记--创建一个3D场景
通过前面的学习,基本掌握了怎么绘制图形,使用纹理,接下来就来创建一个3D场景。基本原理一个复杂的场景肯定是由一些简单的图形,通过某种组合方式构建起来的,在OPenGL中也不例外;例如:在绘制立方体的时候,立方体也是由6个正方形围起来的;基本图形由于显卡在渲染三角形时效率较高,所以我们采用三角形来构建复杂的3D场景;数据结构当您想要使用一系列的数字来完美的表达3D环境时,随着环境复杂度的上升,这个工作的难度也会随之上升;原创 2023-05-06 13:32:18 · 2500 阅读 · 0 评论