
图形学
hankern
Code World,Cool Life
展开
-
openGL之API学习(四十五)正向渲染和延迟渲染
如果你是一个游戏开发者,在你使用的图形引擎中或多或少都听说过forward rendering和deferred rendering。通常你必须在你的游戏中选择一种。但它们是什么,彼此之间有什么不同,我们又该如何选择呢?Modern Graphics Pipelines(现代图形管道)在开始之前,我们必须要知道一点现代可编程图形管线的一些知识。早些时候,我们被显卡的功能限制,不能去改变每个...原创 2019-04-11 21:14:48 · 600 阅读 · 0 评论 -
openGL之API学习(五十二)透视分割 透视除法的执行位置
根据文章https://blog.youkuaiyun.com/hankern/article/details/89220736的分析,透视分割(又叫透视除法)执行的位置在栅格化阶段。原创 2019-04-27 12:25:43 · 811 阅读 · 1 评论 -
openGL之API学习(五十四)glDepthFunc
指定深度测试比较的方法,如果满足深度测试条件则赢得深度测试并会被渲染出来。void glDepthFunc( GLenum func);func Specifies the depth comparison function. Symbolic constants GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL...原创 2019-04-27 21:42:48 · 401 阅读 · 0 评论 -
openGL之API学习(五十三)前面剔除、背面剔除、片段擦除
片段的擦除(discarding fragments)和前面剪裁、后面剪裁(front face culling and back face culling)前面剔除、背面剔除由于这种绘制方法好像两个面都绘制成一模一样(当然实际只绘制一个面,也只可能看到一个面),所以又成为双面渲染。背面剔除使用背面剔除来减少需要绘制的三角形数量背面剔除,顾名思义,就是在渲染的时候,将背对...原创 2019-04-27 21:48:15 · 1159 阅读 · 0 评论 -
openGL之API学习(五十五)凹凸贴图技术
法线贴图是目前游戏开发中最常见的贴图之一。我们知道,一般情况下,模型面数越高,可以表现的细节越多,效果也越好。但是,由于面数多了,顶点数多了,计算量也就上去了,效果永远是和性能成反比的。怎么样用尽可能简单模型来做出更好的效果就成了大家研究的方向之一。纹理映射是最早的一种,通过纹理直接贴在模型表面,提供了一些细节,但是普通的纹理贴图只是影响最终像素阶段输出的颜色值,不能让模型有一些凹凸之类的细节表现...原创 2019-05-03 06:26:33 · 1596 阅读 · 0 评论 -
openGL之API学习(五十六)低模、高模的区别以及各自的使用领域
高模是高细节高精度的3D模型,高模看上去十分逼真细节非常丰富模型的面数也相当的高。低模是游戏里的说法,可以理解为游戏所使用的模型。高模有很多作用可以用于电影制作,广告等等。在游戏里高模主要是为了烘焙NormalMap 并且运用在游戏低模型上使低模拥有近似于高模的细节效果。高模一般是用来制作过长动画和法线贴图的,现在的次世代游戏都采用这种方法,解释起来比较困难请你仔细看(比如一个高模,有很多的面数,...原创 2019-05-03 06:28:46 · 670 阅读 · 0 评论 -
openGL之API学习(五十七)法线贴图、色彩贴图、高光贴图
Normal map :Normal map (法线贴图) 它的作用是模拟出高模上的一些细节纹理,特别是将高模上的圆滑和粗糙度投射到低模上,让低模也有高模的效果。因为高模的面数非常多,导入引擎后电脑是跑不动的,所以用低模加上法线贴图就能很好的解决这个问题。上图是没有用 Normal map (法线贴图)时的效果。下图是用了 Normal map (法线贴图)后的效果。Diffu...原创 2019-05-03 06:31:54 · 1644 阅读 · 0 评论 -
openGL之API学习(五十八)烘焙法线贴图
假如下面是我们的低面数模型,上面是我们的高面数模型,上面的模型在计算光照时,由于面数多,每个面的法线方向不同,所以各个面的光照计算结果都不同,就有凹凸的感觉了,而下面的低模,只有一个面,整个面的光照条件都是一致的,就没有凹凸的感觉了。我们如果把上面的高模的法线信息保存下来,类似纹理贴图那样,存在一张图里,再给低模使用,低模就可以有跟高模一样的法线,进而在计算光照时达到和高模类似的效果,这也就是...原创 2019-05-03 16:56:27 · 696 阅读 · 0 评论 -
openGL之API学习(五十九)Transform Feedback变换反馈
OpenGL ES 3.0、openGL 4.x新增的功能我们总是将顶点数据发送到图形处理器,并且只在帧缓存中生成绘制的像素。如果我们想要在经过顶点着色器或几何着色器之后捕获这些顶点呢?在这一章中,我们将探讨一种方法,即transform feedback。TransformFeedback是OpenGL管线中,顶点处理(如果有几何着色器,那么就在几何着色器后)之后,图元装配之前的一个步骤。...原创 2019-05-06 06:17:40 · 3232 阅读 · 0 评论 -
openGL之API学习(四十八)glDrawArrays
从当前绑定的缓冲区中读取数据按照基本图元的形式绘制几何图形。void glDrawArrays( GLenum mode, GLint first, GLsizei count);mode Specifies what kind of primitives to render. Symbolic constants GL_POINTS, GL_LI...原创 2019-04-18 06:37:49 · 1843 阅读 · 0 评论 -
openGL之API学习(四十七)layout作用详解
原文在https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)GLSL语言规范中也有对此的详细说明https://www.khronos.org/registry/OpenGL/specs/gl/GLSLangSpec.4.60.pdf这里大致翻译如下:布局限定符(GLSL除了这个限定符,还有很多其它限定符,比如存储限定符、...原创 2019-04-17 21:42:22 · 19635 阅读 · 1 评论 -
openGL之API学习(四十九)数据类型
基本数据类型GLSL是一种强类型语言,所有的变量必须事先声明,并给出变量的类型,语法与C语言相似。下表为GLSL的基本数据类型。以上的基本数据类型是都是”透明”的,他们的内部形式都是暴露出来的,与之对于的是”不透明”类型,他们的内部形式没有暴露出来,例如采样器(sampler),图像(image),以及原子计数器(atomic)。他们声明的变量相当于一个不透明的句柄。变量的作用域...原创 2019-04-22 07:01:14 · 311 阅读 · 0 评论 -
openGL之API学习(四十六)opengl图形管线
管线详解下面这个图取自《OpenGL ES 3.0编程指南》,此流程为可编程管线。1.VBO/VAO(顶点缓冲区对象或顶点数组对象):VBO/VAO(到底是啥,下回讲解)是cpu提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。2.VertexShader(顶点着色器):顶点着色器是处理VBO/VAO提供...原创 2019-04-11 21:39:24 · 1026 阅读 · 0 评论 -
openGL之API学习(三十九)纹理和图片的区别与联系
1、区别(1)图片一般指jpg、png等格式化文件,是由文件头、数据体组成的,数据体一般还有一定的压缩算法,尽可能减少文件的体积;纹理不存在文件头,而是一块连续存放颜色值的区域。(2)图片一般位于系统硬盘上,使用时会加载到内存中,供用户开发的应用使用;而纹理一般位于显存中,供着色器程序使用。2、联系纹理中的颜色值可以由图片提供;也可以将纹理中的颜色值保存到图片中。...原创 2019-04-09 06:07:34 · 746 阅读 · 0 评论 -
openGL之API学习(四十)天空盒子
天空盒子将场景空白地方进行填充,给人一种身临其境的感觉。这里有很多天空盒子的资源:http://www.custommapmakers.org/skyboxes.php原创 2019-04-09 06:35:10 · 226 阅读 · 0 评论 -
openGL之API学习(四十一)立方体贴图Cubemap
基本上说cubemap它包含6个2D纹理,这每个2D纹理是一个立方体(cube)的一个面,也就是说它是一个有贴图的立方体。你可能会奇怪这样的立方体有什么用?为什么费事地把6个独立纹理结合为一个单独的纹理,只使用6个各自独立的不行吗?这是因为cubemap有自己特有的属性,可以使用方向向量对它们索引和采样。想象一下,我们有一个1×1×1的单位立方体,有个以原点为起点的方向向量在它的中心。从cub...原创 2019-04-09 21:30:29 · 1400 阅读 · 0 评论 -
openGL之API学习(四十二)glActiveTexture
设置激活的纹理单元,也就是告诉OpengGL状态机当前使用哪个纹理单元,在进行图像采样时,会在这个纹理单元上进行。void glActiveTexture( GLenum texture);texture Specifies which texture unit to make active. The number of texture units is implemen...原创 2019-04-10 06:16:24 · 1819 阅读 · 0 评论 -
openGL之API学习(四十三)glBindTexture
决定使用哪个纹理对象。void glBindTexture( GLenum target, GLuint texture);target Specifies the target to which the texture is bound. Must be one of GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, ...原创 2019-04-10 06:22:40 · 1426 阅读 · 0 评论 -
openGL之API学习(五十)glGetUniformiv
获取指定位置uniform变量的值,这个位置可以由glGetUniformLocation获得。void glGetUniformfv( GLuint program, GLint location, GLfloat *params);void glGetUniformiv( GLuint program, GLint location...原创 2019-04-25 20:57:10 · 981 阅读 · 0 评论 -
openGL之API学习(五十一)VAO VBO EBO
在现代OpenGL(3.0+)的体系里,VAO和VBO已经是个很基本的概念了,是学习GL必须要理解的一个点。1、顶点数组对象(Vertex Arrary Object,VAO)VBO保存了一个模型的顶点属性信息,每次绘制模型之前需要绑定顶点的所有信息,当数据量很大时,重复这样的动作变得非常麻烦。VAO可以把这些所有的配置都存储在一个对象中,每次绘制模型时,只需要绑定这个VAO对象就可以...原创 2019-04-26 06:58:35 · 392 阅读 · 0 评论 -
openGL之API学习(六十)glTransformFeedbackVaryings
配置要从着色器中输出的变量void glTransformFeedbackVaryings( GLuint program, GLsizei count, const char **varyings, GLenum bufferMode);Parametersprogram The name of the target progr...原创 2019-05-06 07:24:18 · 1163 阅读 · 0 评论 -
openGL之API学习(六十一)glFinish和glFlush
通常情况下,OpenGL指令不是立即执行的。它们首先被送到指令缓冲区,然后才被送到硬件执行。glFinish和glFlush都是强制将命令缓冲区的内容提交给硬件执行。glFinish()将缓冲区的指令立即送往硬件执行,但是要一直等到硬件执行完这些指令之后才返回。如果直接绘制到前缓冲,那么在你想保存屏幕截图之前,就需要调用这个函数,确保绘制完毕。如果使用双缓冲,则这个函数不会有太大作用。...原创 2019-05-06 08:16:34 · 420 阅读 · 0 评论 -
openGL之API学习(六十三)GL_RASTERIZER_DISCARD
glEnable(GL_RASTERIZER_DISCARD);使用GL_RASTERIZER_DISCARD标志作为参数调用glEnable()函数,告诉渲染管线在transform feedback可选阶段之后和到达光栅器前抛弃所有的图元。glDisable(GL_RASTERIZER_DISCARD);...原创 2019-05-18 07:23:03 · 1019 阅读 · 1 评论 -
openGL之API学习(六十四)glBeginTransformFeedback
开始变换反馈操作。void glBeginTransformFeedback( GLenum primitiveMode);primitiveMode Specify the output type of the primitives that will be recorded into the buffer objects that are bound for tran...原创 2019-05-18 08:15:13 · 626 阅读 · 0 评论 -
openGL之API学习(六十五)glDrawTransformFeedback
从变换反馈Transform Feedback的缓冲区中绘制图元。与glDrawArrays不同的是不需要指定顶点的数量。void glDrawTransformFeedback( GLenum mode, GLuint id);mode Specifies what kind of primitives to render. Symbolic constan...原创 2019-05-18 08:23:47 · 907 阅读 · 0 评论 -
openGL之API学习(六十六)EmitVertex EndPrimitive
EmitVertex表示输出一个顶点,而EndPrimitive表示结束一个图元的输出,这是一对命令。只有几何着色器才有的命令。几何着色器的图元通过两个特殊的内置函数生成的,即EmitVertex()和EndPrimitive() ,每个着色器请求都必须调用EmitVertex(),以及必须必要的时候使用EndPrimitive()来产生图元,如果没有调用这些函数,那么就不会输出几何体,也就是...原创 2019-05-18 16:17:01 · 2092 阅读 · 0 评论 -
openGL之API学习(六十七)glTexParameter glTextureParameter
设置纹理对象的参数,这两个函数其实是一个功能。void glTexParameterf( GLenum target, GLenum pname, GLfloat param);target Specifies the target to which the texture is bound for glTexParameter functions...原创 2019-05-18 17:08:26 · 1022 阅读 · 0 评论 -
openGL之API学习(八十)狭义的游戏引擎的定义
狭义的游戏引擎的定义(wiki)图形渲染粒子系统物理系统骨骼系统角色系统动画系统场景管理可视剔除层次细节界面模块脚本接口纹理模型资源管理音频功能网络模块AI模块视频功能更新功能多核支持外围工具链...原创 2019-05-30 23:00:38 · 200 阅读 · 0 评论 -
openGL之API学习(八十二)glShaderSource
替换着色器中的代码,任何以前的代码都会被完全替换掉,一次可以上传多段代码进行替换,并不进行代码的扫描和解析替换完后是否需要重新进行编译和链接呢?????(因为着色器代码需要编译、连接,最后生成可执行文件才能被CPU/GPU调度执行,所以替换完后还是需要重新进行编译和链接)void glShaderSource( GLuint shader, GLsizei count,...原创 2019-06-06 21:10:27 · 2175 阅读 · 0 评论 -
openGL之API学习(八十三)glObjectLabel
给一个命名空间的对象打上标签。命名空间可以是GL_BUFFER, GL_SHADER, GL_PROGRAM, GL_VERTEX_ARRAY, GL_QUERY, GL_PROGRAM_PIPELINE, GL_TRANSFORM_FEEDBACK, GL_SAMPLER, GL_TEXTURE, GL_RENDERBUFFER, GL_FRAMEBUFFER。命名空间中的对象可以是buffer...原创 2019-06-07 08:04:10 · 1112 阅读 · 0 评论 -
openGL之API学习(六十二)glBufferData
往gpu缓冲区写入数据void glBufferData( GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);target Specifies the target to which the buffer object is bound for g...原创 2019-05-17 21:32:53 · 3559 阅读 · 0 评论 -
openGL之API学习(七十五)opengl扩展GL_EXT_gpu_shader4
static const char* pFS = " \n\#version 410 \n\ ...原创 2019-05-22 06:50:11 · 1876 阅读 · 0 评论 -
openGL之API学习(七十七)glDrawElements
通过索引方式来绘制几何图元。void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);mode Specifies what kind of primitives to render. Symbolic constants ...原创 2019-05-25 13:13:43 · 597 阅读 · 0 评论 -
openGL之API学习(六十八)core profile、compatibility profile、forward compatibility
OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。在OpenGL 3.0版本之前,OpenGL创建Context都是一致的,随着升级会新增一些内容(例如从OpenGL1.1升级到1.5,会新增一些状...原创 2019-05-19 11:45:35 · 3271 阅读 · 1 评论 -
openGL之API学习(六十九)水平同步 垂直同步
垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平!垂直同步打开,那么在游戏中,或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等垂直同步信号到达,才可以绘制。这样fps自然要受到操作系统刷新率运行值的...原创 2019-05-19 17:16:05 · 2559 阅读 · 0 评论 -
openGL之API学习(七十)windows的opengl扩展wgl
WGL扩展说白了是Windows操作系统和OpenGL做交互的一系列扩展,glut也好,其他框架也好,都是对这些接口进行了封装。之前的文章也提到了,Windows在对OpenGL的原生支持非常不友好,甚至差点就夭折了,在wingdi.h这个头文件中是有一堆接口用于创建OpenGL Render Context的,但是使用这些API创建的版本非常低,好像也就1.1~1.4的样子,而且还是软件实现,总...原创 2019-05-19 17:24:00 · 1644 阅读 · 0 评论 -
openGL之API学习(七十一)Direct3D和DirectX
Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口,由微软公司所制定的3D规格界面,与Windows 95和Windows NT操作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层操作,大大提高了游戏的运行速度,是DirectX的一部分,目前广为各家显示卡所支援。与OpenGL同为电脑绘图软体和电脑游戏...原创 2019-05-20 06:31:40 · 1071 阅读 · 0 评论 -
openGL之API学习(七十二)opengl调试Debug
现在支持GLSL和OpenGL跟步调试的只有Nvidia的Nsight,只支持Nvidia的显卡;其他的基本都是track,不支持GLSL的跟步调试,比如AMD的GPUPerfClient以及gDEBugger。还有AMD的GPU ShaderAnalyzer也非常的不错,能看到相应的GLSL汇编代码。...原创 2019-05-20 06:59:05 · 996 阅读 · 0 评论 -
openGL之API学习(七十三)opengl与Direct3D(D3D)
架构上:在架构上其实两者没有什么区别,只是D3D的runtime是在OS里,对于不同硬件来说都是一样的。而OpenGL的runtime直接是和驱动合为一体的。但这并不会造成性能有所差别。shader上:OpenGL 的原生shading language是GLSL,D3D的是HLSL。两者语法相似,但细节上天差地别。好在,NVIDIA的Cg在很大程度上类似于HLSL,而且可以编译 ...原创 2019-05-20 15:10:11 · 633 阅读 · 0 评论 -
openGL之API学习(七十四)opengl版本的历史沿革
OpenGL源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI在1992年7月发布1.0版,后成为工业标准,由成立于1992年的独立财团OpenGL Architecture Review Board (ARB)控制。SGI等ARB成员以投票方式产生标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了...原创 2019-05-20 19:19:16 · 466 阅读 · 0 评论