opengl
文章平均质量分 51
彭同学她同桌
这个作者很懒,什么都没留下…
展开
-
OpenGL3.3-优化
美术资源方面模型使用lodLOD也称为层次细节模型,是一种实时三维计算机图形技术就是远处的就不用那么精细 近处的精细一些非连续LOD模型类似于mipmap 生成副本金字塔 每个副本对应一个特定的分辨率优先: 不用在线生成模型 已经提前生成好了金字塔缺点:占用多余空间 数据冗余 并且不同分辨率之间没有连续性 在切换时会有跳转的感觉连续LOD模型某一时间只保留某一分辨率的模型 实际上就是实时生成那个副本 不预先存储优缺点和非连续的相反节点LOD模型本身是一个分辨率结构。不同分辨率模型原创 2021-09-08 16:25:30 · 1071 阅读 · 0 评论 -
OpenGL-overDraw
什么是overdrawoverdraw是指同一帧中一个像素被重复渲染的次数像素填充率GPU在每一帧内向帧缓冲中写入像素的数量 通常计算方法按照光栅化单元乘以这个GPU的核心时钟频率来获得关于一个正常渲染如果我们不考虑z-early这种 正常绘制 从后往前绘制 我们会先绘制球 然后在深度缓冲区 和颜色缓冲区填入数据(因为这个时候一定能通过深度测试 深度测试里面没有数据) 然后再绘制立方体的时候 同样会通过深度测试 这样就会覆盖前面球体填入深度缓冲和颜色缓冲的数据 这样就造成前面的填入的没有意义的原创 2021-09-02 21:28:08 · 309 阅读 · 0 评论 -
OpenGL-通用渲染管线(URL)
通用渲染管线(URL)原创 2021-09-01 11:05:54 · 62 阅读 · 0 评论 -
OpenGL-帧缓冲区位块传送(Blit)
帧缓冲区位块传送(Blit)原创 2021-09-01 11:02:49 · 339 阅读 · 0 评论 -
OpenGL3.3-PCF
PCF主要用来解决阴影出现锯齿问题我们前面说到阴影出现锯齿的原因在于depthmap的分辨率较低 导致多个像素采样同一个纹理中的纹素 出现一整片的阴影而PCF的核心思想是一个像素对纹理周围的多个纹素进行多次采样 我们就会得到 该像素自己的深度值 在depthmap中采样到的多个纹素的深度值 然后我们将像素自己的深度值和多个纹素的深度值进行比较 取平均值首先他需要用gMapSize获取depthmap的纹理大小 因为纹理坐标是从0-1 所以就用1/gMapSize可以知道每个纹素之间的间距 这样方便我原创 2021-08-23 15:47:21 · 261 阅读 · 0 评论 -
OpenGL3.3-级联阴影贴图CSM
级联阴影贴图核心思想是采用多张深度贴图 主要是为了解决阴影锯齿状的问题原创 2021-08-20 13:51:17 · 344 阅读 · 0 评论 -
OpenGL3.3-项目难点
引擎项目显示坐标轴会被其他物体遮挡的问题当初想了一个是绘制坐标轴的时候不进行深度测试 发现坐标轴很怪然后就想是将坐标轴z值设置成固定值 发现也不行原创 2021-08-20 12:09:57 · 290 阅读 · 0 评论 -
OpenGL3.3-SSAO
什么是SSAOscreen space ambient occlusion 屏幕空间环境光遮蔽环境光主要是让整个环境更亮一点 模拟光线的二次散射 因为phong光照模型中只有环境光 漫反射光 镜面反射光 如果我们取消环境光 并且我们的物体并不是在光线能直接照射的地方 就会发现这个物体完全是黑暗的 所以我们就引入了环境光 但是此时就会有一个问题我们会发现在任何非光照直射的地方亮度也就是环境光的亮度都是一样的 比如桌子下面和桌子不在光照直射范围的地方 但是很明显 桌子下面应该更暗一些 SSAO就是为了原创 2021-08-18 17:51:05 · 318 阅读 · 0 评论 -
OpenGL-MSAA
什么是MSAA多重采样抗锯齿 就是通过在一个像素点中增加子采样点实现抗锯齿具体流程假设我们是将一个像素点增加到四个子采样点我们会对每一个子采样点进行采样 比如说左边两个子采样点被红色采样到了 也就是红色的三角形包括了他们 而另外两个子采样点就被蓝色的采样了 都会被存进颜色缓冲中 然后再fs的时候取平均值 每个子采样点也会执行模板查询和深度查询 防止一部分被遮住了 但是还是显示出来了 所以如果使用了MSAA就会导致颜色缓冲 深度缓冲多n倍...原创 2021-08-18 17:50:56 · 478 阅读 · 0 评论 -
OpenGL3.3-裁剪
如何裁剪判断点与裁剪平面的关系这是一个三维空间 plane是裁剪平面 P是裁剪平面上的一个点 n是裁剪平面的法线判断线与裁剪平面的关系其实从上面我们就能知道 分别通过两个点和裁剪平面的关系我们能知道正负值 这样我们就能知道关系了当线和裁剪平面相交时我们应该做的是求交点 然后通过交点裁剪出位于裁剪平面内部的三角形例如求点II = Q1 + t × (Q2-Q1)如何在四维裁剪比如我们要对(x,y,z)这个点进行(1,-1)(1,-1)(1,-1)这三个维度进行裁剪 转到(x,y,原创 2021-08-16 21:24:20 · 654 阅读 · 0 评论 -
OpenGL3.3-内置函数
step(a, x)如果 x<a,返回 0;否则,返回 1网站可以看这网站原创 2021-08-13 19:25:49 · 718 阅读 · 0 评论 -
OpenGL3.3-着色器if-else问题
首先我们知道着色器是GPU上面的小程序 他是运行在GPU上面的而GPU的特点是高度并行的SIMDsingle instruction multiple data一条运算指令在多个数据上执行 同时计算出结果例如十六个线程执行的指令都是一样的 这样方便计算出多个顶点的变化SIMTsingle intruction multiple thread与simd类似 但是可以处理指令的分支 但是会造成等待和压力例如有16个线程 可以8个执行if 8个执行elsewarpGPU中并行执行的一组线程原创 2021-08-13 19:14:55 · 649 阅读 · 0 评论 -
OpenGL-面试
试描述现代OpenGL渲染管线。首先输入的模型顶点数据会进入vertex shader,会对顶点坐标进行模型变换、视口变换、投影变换,并且将其转换到标准设备坐标NDS第二阶段进行图元装配,绘制相应的图元第三阶段在geometry shader中,将上一阶段图元形式的一系列顶点作为输入,产生新的顶点来构造出新的图元第四阶段将几何着色器输出的结果进行光栅化,将图元映射为屏幕上相应的像素,生成fragment给片段着色器使用,这一步还会裁减掉视图以外的像素第五阶段在fragment shader中,计原创 2021-07-19 17:21:54 · 4267 阅读 · 1 评论 -
OpenGL-正轴测图
什么是正轴测图当以xoy面为轴测投影面是 现将物体绕z轴转伽马γ角接着绕x轴转-阿尔法α角 左后想xoy面投影T正 = TZ* T X *TV等轴测图当投影面与三个坐标轴之间的夹角都相等时为等轴测图正二轴测图当投影面与两个坐标轴之间的夹角相等时为正二测图正三测图当投影面与三个坐标轴之间的夹角相等时为正三测图...原创 2021-06-29 15:55:19 · 840 阅读 · 0 评论 -
OpenGL-bezier曲线
曲线参数方程每一个t带入方程可以得到空间或平面上的一个点 当t从0-1就会得到bezier曲线nn表示次数 是几次bezier曲线Pi(0,1,2,…n):控制多边形的n+1个顶点(伯恩斯坦基函数)Bi,t(t):二次bezier曲线此时有三个控制点 P0,P1,P2 ,n=2最终简化 直接可以调用矩阵形式三次bezier曲线最终简化bezier曲线性质端点性就是一定会经过第一个和最后一个点对称性假设n次bezier曲线控制多边形的顶点位置不变 把次序颠倒过来原创 2021-04-30 17:14:23 · 427 阅读 · 0 评论 -
OpenGL-非均匀有理B样条
什么是非均匀有理B样条Non-Uniform(非均匀性):是指一个控制顶点的影响力的范围能够改变。当创建一个不规则曲面的时候这一点非常有用。同样,统一的曲线和曲面在透视投影下也不是无变化的,对于交互的3D建模来说这是一个严重的缺陷。Rational(有理):是指每个NURBS物体都可以用有理多项式形式表达式来定义。B-Spline(B样条):是指用路线来构建一条曲线,在一个或更多的点之间以内插值替换的。...原创 2021-04-29 12:29:16 · 1079 阅读 · 0 评论 -
OpenGL-3.3 GL_ATOMIC_COUNTER_BUFFER缓冲区(原子计数器)
创建缓冲区GLuint atomicsBuffer;//创建了一个缓冲对象glGenBuffers(1, &atomicsBuffer);glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomicsBuffer);glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint) * 3, NULL, GL_DYNAMIC_DRAW);glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, 0);原创 2021-04-27 15:49:10 · 319 阅读 · 0 评论 -
OpenGL-obj
#应该是注释o Cube #指定了模型名称mtllib cube.mtl #这里是引用了一个外部材质文件cube.mtlnewmtl 材质.001 #使用newmtl定义了一个新的材质,可以被cube.obj文件来引用我这里定义的材质纹理信息Ns 96.078431 #使用Ns 来指定高光色的权重Ka 1.000000 1.000000 1.000000 #|Kd 0.007611 0.000000 0.640000 #|=====>>>ka,kd,ks分别定义了表面的环境色,原创 2021-04-20 11:39:17 · 155 阅读 · 0 评论 -
OpenGL-PN算法曲面细分
原理原理是通过一个几何上的贝塞尔表面来替换原始的网格数据进而对精细度较低的网格进行平滑处理。原创 2021-04-16 17:18:30 · 209 阅读 · 0 评论 -
OpenGL-空间曲线
曲面曲面可以被表示为 F(x,y,z) = 0例如x2+y2+z2-2x+4y = 0表示的就是一个球面曲线空间曲线可以被看做是两个曲面相交的的交线所以 一条曲线可以被看做F(x,y,z) = 0和G(x,y,z) = 0两个曲面方程的相交点 也就是曲线上的点一定都同时满足这两个方程所以曲线的一般方程(交面式方程)例如求解得所以相交是一个圆 半径是(根号5-1)/2的平方根曲线的参数方程得到曲线在z轴上的投影就是把两个式子联立 把z消掉...原创 2021-04-09 15:35:47 · 752 阅读 · 0 评论 -
OpenGL-曲面细分
曲面细分名词TCS(细分控制着色器)Tessellation control shader细分控制着色器TES(细分曲面计算着色器)Tessellation EValuation shader控制点这些被称为控制点的顶点定义了一个曲面patch一组控制点被称为一个patch上图就是由16个控制点组成的patchTLs(曲面细分精细程度)Tessellation Levels 对这一个 patch 需要生成多少个三角形例如,我们可以定义如果光栅化之后的三角形将会覆盖的像素点的个数小原创 2021-04-09 13:29:18 · 1449 阅读 · 0 评论 -
OpenGL-NURBS(非均匀有理B样条)
B样条的工作方式B样条的工作方式类似于贝塞尔曲线,但不同的是曲线被分成很多段。每段曲线的形状只受到最近的四个控制点的影响,这样曲线就像是4阶的贝塞尔曲线拼接起来的原创 2021-04-09 13:29:09 · 464 阅读 · 0 评论 -
OpenGL-延迟渲染第二步
为什么选择5/256这个数作为一个合适的光照值除以256是因为默认的8-bit帧缓冲可以每个分量显示这么多强度值应该就是把5/256作为最暗能被片元着色器计算的亮度 也就是如果光照通过衰减方程计算得到为5/256时的球半径就是片元着色器需要计算的最大半径关于深度缓冲和清除的问题glDepthMask(GL_TRUE);在清除深度缓冲区之前,必须先对其进行写入。如果将深度蒙版设置为FALSE,则glClear()不会触摸深度缓冲区。...原创 2021-04-07 15:51:42 · 106 阅读 · 0 评论 -
OpenGL-GPU
GPU中着色器的运行是高度并行的,大部分的架构要求对于一个大的线程集合,GPU需要对它运行完全一样的着色器代码从而获得高效率。这通常意味着一个着色器运行时总是执行一个if语句所有的分支从而保证着色器运行都是一样的...原创 2021-04-07 14:38:17 · 171 阅读 · 0 评论 -
OpenGL3.3-延迟着色法
延迟包含两个阶段1.几何处理阶段先渲染一次场景 获取到所有对象的几何信息存储在一系列叫G缓冲(G-buffer)的纹理中2.光照处理阶段 使用G缓冲的纹理数据原创 2021-03-20 11:17:22 · 591 阅读 · 0 评论 -
opengl3.3-Uniform缓冲对象
简单来说就是把要一个个uniform的数据全部放到一个uniform缓冲对象中着色器设置好如何存放 怎么取 就可以直接从缓冲对象中取值还需要告诉OpenGL内存的哪一部分对应着着色器中的哪一个uniform变量uniform块布局首先是uniform块布局(写在着色器中)也就是告诉OpenGL 该怎么去读取这个uniform缓冲layout (std140) uniform ExampleBlock{ float value; vec3 vector; mat4 m原创 2021-03-19 17:20:09 · 262 阅读 · 0 评论 -
OpenGL-关于绕任意轴旋转
实现原理将鼠标在屏幕的x轴位移向量 × 摄像机的右边方向再将鼠标在屏幕的y轴位移向量 × 摄像机的头顶方向将两部分相加获得了一个向量MouseTrace再获得摄像机面前方向向量 camera.front这两个向量确定了一个面 将两个向量进行叉乘 获得这个面的法向量这个法向量就是任意轴的旋转轴然后再求MouseTrace的长度 这个长度就可以看作旋转角度这样就可以确定旋转轴和旋转角度glm::vec3 MouseTrace = (camera.Right * mouse.LeftFxoffs原创 2021-03-02 16:31:30 · 2272 阅读 · 0 评论 -
OpenGL3.3-通过物体坐标系对物体实现鼠标移动
这里写自定义目录标题实例实现过程实例如图中 红色是黑色长方形的x轴 蓝色是z轴 绿色是y轴 我们如果点击相应轴向正或负方向移动 物体也会跟着移动实现过程1.首先我们为需要被移动的物体和坐标轴都设置了objID用于拾取(具体实现方法看3d拾取)shader.setInt("gobjectIndex", i);2.当我们鼠标点击屏幕时会拾取点击处的像素所对应objID以确定我们是否点击到了物体//如果鼠标点击到了物体 该物体是我们想要移动的物体时 我们将坐标系移动到物体的中心方便移动if (原创 2021-02-23 02:59:15 · 1006 阅读 · 0 评论 -
OpenGL3.3-2D和3D坐标转换问题
3D->2D(模型变换)原坐标 * model矩阵 = 世界坐标(视变换)世界坐标 * view矩阵 = 视坐标(以摄像机为原点的坐标)(投影变换)视坐标 * projection矩阵 = 裁剪坐标 此时就是x,y,z在(-1,1)(透视除法)裁剪坐标/w值 = NDC坐标 GPU自动执行 NDC坐标是x,y,z在(-1,1)(视口变换)NDC坐标->屏幕坐标 将x,y变换到w,h 对z变换,从[-1,1]变换到[0,1]2D->3D获取鼠标坐标1.通过glf原创 2021-02-19 13:35:05 · 893 阅读 · 1 评论 -
OpenGL3.3-错误集锦
这里写自定义目录标题OpenGL header already included, remove this include, glad already provides itOpenGL header already included, remove this include, glad already provides it就是#include <glad/glad.h>头文件必须放在所有头文件的前面 如果出现这个问题 直接在其他头文件上面加一个#include <glad/glad原创 2021-01-23 17:29:23 · 445 阅读 · 0 评论 -
OpenGL3.3-细分着色器
目录什么是面片函数(设置面片顶点数)glPatchParameteri(GLenum paname,GLint value)内置变量(获取gl_in的元素个数)gl_PatchVerticesIn什么是面片是一个传递给OpenGL的顶点列表使用面片绘制的区别:如果我们不使用面片绘制图形 我们就是使用默认的图元类型 这些类型都是已知图元类型和顶点数量的对应关系 例如三个顶点对应于一个三角形 或者两个顶点对应于一条线但是如果使用面片 我们无法知道一个面片包含了多少个顶点 所以就要使用glPatchPa原创 2021-01-22 16:03:51 · 1461 阅读 · 4 评论 -
OpenGL3.3纹理
使用纹理坐标获取纹理颜色叫做采样一个纹理的位置值通常称为一个纹理单元。一个纹理的默认纹理单元是0,它是默认的激活纹理单元glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT)函数; (配置纹理属性)第一个参数是指定为2d坐标 第二个参数需要我们指定设置的选项与应用的纹理轴 像案例中就是配置的是WRAP选项...原创 2020-01-05 11:12:29 · 1724 阅读 · 0 评论 -
OpenGL3.3纹理(更新)
什么纹理纹理贴图是将指定的部分纹理图象映射到每个图元上取样:在片段着色器中将纹理坐标和纹理进行匹配就是取样 取样的结果 也就是取样取到的就是纹素纹素:纹理中的一个像素 纹素通常包含一个颜色值 用于画屏幕上对应的一个像素纹理坐标:(u,v)纹理存储空间:存储给定纹理中的所有纹素纹理存储空间的属性:用来存储给定纹理中的所有纹素(以及所有mipmap层次中的纹素)的内存总量,他需要根据选定的内部格式和对应的分辨率来决定 那这么说应该就是存储空间的内存总量纹理对象:管理着一片纹理空间数组纹理:由一维原创 2020-12-21 17:16:33 · 1312 阅读 · 1 评论 -
OpenGL3.3TransformFeedback实现粒子系统
目录关于TransformFeedback介绍可以看另一篇博客TransformFeedback理解原创 2020-12-15 20:04:36 · 211 阅读 · 0 评论 -
缓冲区 缓存
目录缓冲区缓存缓冲区缓存原创 2020-12-14 20:20:31 · 382 阅读 · 0 评论 -
OpenGL3.3transform feedback再理解
这里写自定义目录标题什么是transform feedbacktransform feedback的作用transform feedback对象transform feedback状态transform feedback缓存绑定点transform feedback对象的创建transform feedback缓存(创建tf)glCreateTransformFeedbacks(GLsizei n,GLuint *ids)(绑定tf)glBindTransformFeedback(GLenum target原创 2020-12-11 23:17:08 · 1912 阅读 · 1 评论 -
OpenGL3.3视锥体
目录frustum(float left,float right,float bottom,float top,float near,float far)(创建观察矩阵)lookAt(vec3 eye,vec3 center,vec3 up)frustum(float left,float right,float bottom,float top,float near,float far)根据给定的视锥体返回一个透视投影矩阵 近平面的矩阵通过left right bottom top定义 近远平面的距离原创 2020-12-09 22:56:56 · 763 阅读 · 0 评论 -
OpenGL3.3透视投影二
正射投影我们只需要把物体移到坐标系中心 然后再将整个坐标缩放在[-1,1]之间就行了最终正交矩阵透视投影计算机图形网课老师的办法我们可以把透视投影的计算分两步1.计算一个可以把透视投影转换成正射投影的矩阵a2.将矩阵a和正射投影矩阵相乘得出最终的透视投影矩阵有通俗的话来说 就是先将透视投影的远平面压成和近平面一样大 这样其内部的点的坐标都发生了改变 这样就可以按照正射投影来算了首先我们知道 透视投影有几个特点1.在近平面上的坐标不会发生任何改变2.在远平面上的坐标z值不会发生改原创 2020-12-07 20:03:13 · 248 阅读 · 0 评论 -
OpenGL3.3透视矩阵原理计算
正射投影我们只需要把物体移到坐标系中心 然后再将整个坐标缩放在[-1,1]之间就行了最终正交矩阵透视投影我们可以把透视投影的计算分两步1.计算一个可以把透视投影转换成正射投影的矩阵a2.将矩阵a和正射投影矩阵相乘得出最终的透视投影矩阵有通俗的话来说 就是先将透视投影的远平面压成和近平面一样大 这样其内部的点的坐标都发生了改变 这样就可以按照正射投影来算了首先我们知道 透视投影有几个特点1.在近平面上的坐标不会发生任何改变2.在远平面上的坐标z值不会发生改变3.在中心点的坐标在近原创 2020-12-07 18:43:37 · 1346 阅读 · 1 评论 -
OpenGL3.3 视口变换 裁剪
目录观察视图观察视图原创 2020-12-05 13:34:10 · 2231 阅读 · 0 评论