4 Jaihk662

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 1k+

OpenGL基础41:几何着色器

在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在《OpenGL基础3:渲染管线》这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果一、最简单的几何着色器(Geometry Shader)几何着色器的输入:一个或多个表示单独基本图形(primitive)的顶点,这个基本图形可以是点、线或者三角形输出:处理过后的基本图形顶点,这些顶点无论是大小还是位置,甚至是数量、基本图形单元都可以被改变、拼装最“简单”的几何着色器如下:#version...

2020-07-31 14:12:53

OpenGL基础40:Uniform缓冲

前置:OpenGL基础39:GLSL内建变量与接口块想想之前代码,glUniform()和glGetUniformLocation()的使用数量是不是过于频繁了,对于每个着色器的每一个uniform变量,都需要特意去设置,不但代码特别长,而且大多都是重复的一、Uniform对象没错,就是UBO,这不知道是第几个缓冲对象(xBO)了,不过也好,这样不用去查都可以大致知道它的意思和作用在之前的例子中,几乎所有的物体着色器中都有投影矩阵和观察矩阵,值也是相同的(都处于一个世界中怎么可能不一样...

2020-07-30 16:02:26

OpenGL基础39:GLSL内建变量与接口块

GLSL有几个以gl_为前缀的变量(内建变量),它们在着色器中能直接获取和使用,并且都有着很重要的意义,gl_Position 和 gl_FragCoord 就是两个典型的内建变量一、顶点着色器变量gl_Position:顶点着色器裁切空间输出的位置向量。想让屏幕上渲染出东西,那么就必须使用,否则将什么都看不到,在第一次接触顶点着色器之后,就一直在用它了gl_PointSize:渲染出的点的大小,需要满足以下两个条件,gl_PointSize才会是有效的:glEnable(GL...

2020-07-29 20:16:27

OpenGL基础38:数据存储

一、缓冲数据OpenGL中的缓冲就是一块内存区域的对象,将缓冲绑定到一个特定缓冲对象的时候,就给缓冲赋予了一个特殊的意义,例如绑定到GL_ARRAY_BUFFER的时候,这个缓冲就是一个顶点数组缓冲,绑定到GL_ELEMENT_ARRAY_BUFFER的时候,这个缓冲就是个顶点索引缓冲之前的用法一直都是这样:GLuint skyboxVAO, skyboxVBO;glGenVertexArrays(1, &skyboxVAO);glGenBuffers(1, &sky...

2020-07-28 16:53:51

OpenGL基础37:反射与折射

前置:OpenGL基础20:镜面光照一、反射不一定所有的光源都是简单的白光,不仅如此,光线也是可以多次反射的,例如一面镜子,可以从中看到远处的风景,一些金属材质的物体表面也会反射周围物体的光这主要就是着色器的改动,和漫反射以及镜面反射一样,还有一种贴图叫做反射贴图,当然了,是否是贴图只是着色器写法上的问题,有了之前的经验,搞定这个不是问题反射的计算方式和之前的镜面反射很像,,着色器如下:#version 330 corelayout (location = 0) in ve...

2020-07-21 18:25:29

OpenGL基础36:天空盒

一、立方体贴图立方体贴图就是6个2D贴图,每个贴图都是立方体的一个面,当然这样的立方体贴图是一个整体,有自己特有的属性,可以使用方向向量对它们索引和采样立方体贴图的主要作用:其组成了一个完全封闭的空间,这就意味着从立方体中间发出任意方向的向量,一定会触碰到立方体表面的一个点,也就是立方体贴图的纹理位置,从而就可以获取所有顶点的纹理坐标,再通过这个纹理坐标就能获取到立方体贴图上正确的纹理沿着黄色的方向向量,可以得到对应黄色块的纹理坐标创建一个立方体贴图:GLuint textur...

2020-07-16 17:59:04

OpenGL基础35:帧缓冲之简单图像处理

在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风、将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个场景渲染到一张泛黄的纸上以体现出年代感……当然是修改着色器,事实上,很多地方都是这么做的,不过有些情况下,场景中的物体和对应的着色器都不少,若是想要整个场景(视口)体现出某个效果,就需要借助别的方法了接上文:OpenGL基础34:帧缓冲之附件接下来就可以开始实战了五、黑白画根据上文的目...

2020-07-15 17:04:44

OpenGL基础34:帧缓冲之附件

在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风、将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个场景渲染到一张泛黄的纸上以体现出年代感……当然是修改着色器,事实上,很多地方都是这么做的,不过有些情况下,场景中的物体和对应的着色器都不少,若是想要整个场景(视口)体现出某个效果,就需要借助别的方法了接上文:OpenGL基础33:帧缓冲之离屏渲染三、纹理附件接下来,就是想办法往帧缓冲里添加...

2020-07-15 15:22:14

OpenGL基础33:帧缓冲之离屏渲染

在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风、将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个场景渲染到一张泛黄的纸上以体现出年代感……当然是修改着色器,事实上,很多地方都是这么做的,不过有些情况下,场景中的物体和对应的着色器都不少,若是想要整个场景(视口)体现出某个效果,就需要借助别的方法了一、帧缓冲为了解决这个问题,来学习帧缓冲吧,当有了目的之后才能更好的去理解和掌握。这一章相对之...

2020-07-13 21:07:02

OpenGL基础32:面剔除

一个标准的立方体总共6个面,对于每个面又有里外之分,因此若要绘制一个正方形的话,总共需要绘制12个面,然而事实上,对于每个面,我们在玩家视角一定只能看到它的一个朝向换句话说,对于一个六个面的正方体,我们一定只能看到最多三个面,这样的话,有个很明显的优化方法:不再绘制玩家看不到的面!一个好消息是,openGL自带这样的优化一、绘制顺序当定义一系列的三角顶点时,他一定也同时定义了一个特定的连接顺序(Winding Order),它们可能是顺时针的或逆时针的,每个三角形由3个顶点组成,我们从三角...

2020-07-13 15:09:31

OpenGL基础31:混合

在很多游戏场景中,地面往往都不是完全干净和平坦的,如果是草坪,那么肯定会有一些长得比较高的杂草,而对于沙地,往往总会有一些奇形怪状的石头等,一般来讲确实可以用模型,但是贴图也是一个不错的选择一、Alpha值考虑给地面铺上“石头”:注意如果想加载这种纹理,最好保证空白的部分是透明的而并非为白底!前面讨论过颜色的属性:RGB,其实颜色还有一个属性A代表为透明度也就是说:RGBA才是一个表示颜色的“完全体”,如果想渲染一些半透明的材质,就必须要考虑到透明度这一属性,就如上面的石头...

2020-07-10 17:15:24

OpenGL基础30:模板测试

前置:OpenGL基础29:深度测试一、模板测试前面一章提到过:深度缓冲是在片段着色器运行、以及模板测试(Stencil Testing)之后,那么这下知道模板测试是在什么时候了吧,模板测试和深度测试逻辑可以说是一致的,它能丢弃一些片段,仍然保留下来的片段将会进入深度测试阶段:glEnable(GL_STENCIL_TEST):开启模板测试 glClear(GL_STENCIL_BUFFER_BIT):清空模板缓冲可以用模板测试实现一些非常有意思的效果,一个最经典的例子就是3D物体的描...

2020-07-03 18:40:08

OpenGL基础29:深度测试

前置:OpenGL基础11:空间一、深度测试在OpenGL基础13:第一个正方体这一章中,就开始用深度测试了深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且通常和颜色缓冲有着一样的宽度和高度,深度缓冲是由窗口系统自动创建的,它会以16、24或32位float的形式储存它的深度值,在大部分的系统中,深度缓冲的精度都是24位的当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的的深度值与深度缓...

2020-07-03 12:29:10

OpenGL基础28:模型

参考文献:https://learnopengl.com/#!Getting-started/OpenGL前置:OpenGL基础27:网格一、模型有了mesh类之后,接下来就是实现一个model类将各个mesh拼成一个模型首先是模型的创建:很好理解,就是一次绘制其所有的mesh:public: Model(const GLchar* path) { this->loadModel(path); } void Draw(Sha...

2020-06-30 20:05:16

OpenGL基础27:网格

一、网格(Mesh)从字面上的意思来看就是下面这个东西:其实差不多,如果你是游戏开放相关的工作者,又或者了解过图形学,应该都听过网格(Mesh)这个词,大概印象是下面这样的:...

2020-06-23 16:33:24

OpenGL基础26:Assimp库

一、模型文件游戏中有很多复杂的模型往往都是美术通过3D建模工具构建出来的,当然不是程序将顶点写死在代码里的,想想看一个简单的人物模型可能就有上千个顶点,这个时候按之前“生成木箱子”的方法肯定就不可行了从3D模型的设计到最后体现在场景中,整个过程可以分为2个步骤当使用3D建模工具导出模型文件时,建模工具会自己生成所有的顶点坐标、顶点法线和纹理坐标等信息,这些图像技术细节并不需要美工去处理,美工只需要关心如何构建高品质的模型,所有的技术细节内容都隐藏在里导出的模型文件里。而对于图形开发者,就必...

2020-06-19 17:15:14

OpenGL基础25:多光源(附简单GLSL配置)

到这里,光照基础就已经接近尾声了,当然对于光照渲染的学习,这可能只是百步中的一步,尽管如此,至少是做到了从 0 到 1 的一个过程,就像之前刚学会“HelloWorld”一样,一切伟大的行动和思想,都有一个微不足道的开始再次声明:直至这一章,主要还是参考于https://learnopengl.com/,当然这不仅是翻译,也结合了不少其它的文献和教学视频,和原文略有不同,很多地方去掉了繁杂或不重要的描述,加入了自己的看法,整体更加整洁易懂如有问题/错误,求反馈一、GLSL配置之前...

2020-06-16 20:24:51

OpenGL基础24:聚光灯

前置:OpenGL基础23:平行光与点光源一、聚光灯三种基础光源在上一章讲了2种,现在只剩下聚光灯了手电筒就是一个很经典例子,相对于点光源,聚光灯拥有以下特点依然有衰减,但是聚光灯的光照一般都是非常强的(也就是有着非常远的射程) 有一定的范围,在这个范围外光照极速衰减,距离聚光方向超过一定角度,哪怕离光源很近,也有可能完全没有光照 依上,既有位置属性,又有方向属性(聚光方向)那么也就是说,相对于点光源,聚光灯会额外多出2个属性:聚光方向和切光角如下图:其中就是入射光向量与...

2020-06-16 11:49:30

OpenGL基础23:平行光与点光源

前面几章主要是针对物体,现在开始针对光源!一、平行光在OpenGL基础18:光照基础这一章里面讲了几种常见光源,先看平行光吧一个很好的例子就是太阳光,因为离我们的距离过远,所以太阳光的特点就是“无限范围”且平行所有的光线都是平行的,这样的话物体与光源的相对位置是不重要的,在之前的章节,Light里面都有position这一属性,对于平行光而言,这个属性就由direction替代,代码改动如下:struct Light{ // vec3 position; v...

2020-06-15 19:46:22

OpenGL基础22:贴图

在OpenGL基础13:第一个正方体中给正方体加了箱子的纹理,但是在后面介绍光照的时候又把纹理属性给丢了,现在尝试在有纹理的基础之上增加光照一、漫反射贴图先把之前的纹理加回去顶点着色器和主代码的处理和之前OpenGL基础9:纹理 纹理这一章一样,而对于片段着色器,需要进行稍加修改在OpenGL基础21:材质这一章里,给予了物体材质属性,包括:ambient:定义了在环境光照下这个物体反射的是什么颜色,通常是和物体颜色相同的颜色 diffuse:定义了在漫反射光照下物体的...

2020-06-11 19:45:48

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 1024超级勋章
    1024超级勋章
    授予原创文章总数达到1024篇的博主,感谢你对CSDN社区的贡献,CSDN与你一起成长。
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。