顶点坐标

Unity Shader 基础教程

耗尽温柔 提交于 2019-12-03 16:08:27
Unity-Shader-基础教程 在Github上看到一篇关于Unity-Shader的教程,感觉还不错,作者写的很好,很适合Unity-Shader的基础入门,我在这里翻译一下,分享给大家,英文水平很烂,大致能明白Unity-Shader是什么,渲染管线的工作流程,以及Unity Shader的一些类型和怎样编写Unity Shader。 ( 原文链接 ) 第一部分:什么是Shader? Shader是计算机图形渲染管线的一部分,它是一小段应用程序,告诉计算机在场景中怎样对物体渲染和着色。这个过程包括计算颜色和光照值,并将其给予对象,以至于对象被显示在屏幕上。和上面一样,Shader也被用来创建游戏中的一些特殊的和后期处理效果。 在现代游戏引擎中(包括Unity),Shader运行在可编程的GPU渲染管道中,在GPU中允许并行运行,并且能够很快速的进行许多着色计算。 第二部分:渲染管道 为了学习Shader,我们将简单的了解渲染管道,我们将在本教程中讨论下面这张图片: 我更加倾向把Shader看做是由一种信息类型(模型数据、颜色等等)到另外一种信息类型(像素/片元)的变换,对象数据继承与对象本身,例如模型中的点、法线、三角形、UV坐标等等。我们可以把自定义数据/传递到shader中使用,颜色、纹理、数字等等这些。 着色器流水线的第一步是顶点函数。正如你所知的,顶点就是一些点

unity Shader 内置函数

家住魔仙堡 提交于 2019-12-03 16:06:51
一、数学内置函数 1、Step(a,x):如果x<a返回0;如果x>或=a返回1 2、Clamp(x,a,b):如果x<a返回a;如果x>b返回b;如果在a和b之间就返回x 3、smoothstep(min,max,x):返回的值为–2*(( x – min )/( max – min ))3 +3*(( x – min )/( max – min ))2 4、lerp(a,b,f):线性插值函数,返回值为(1-f)*a+b*f 5、三角函数sin、cos 6、saturate(x): clamp x to range [0,1]。将x裁剪到0和1之间,大于1取1,小于0取0。在half-lambert中会经常用到 7、normalize(x): return a normalized vector。返回一个归一化的向量。通常在fragment shader中使用 8、dot(x, y): 两个向量的点乘结果。|a||b|cos(a)。光照计算中经常用到 9、mul(x, y): 矩阵乘法,结果依然为一个矩阵。[m, n] [n, q]=>[m,q],前行乘后列。坐标空间转换中经常使用 10、reflect(i, n): 得到反射光线的方向 11、refract(i, n, R): 得到折射光线的方向。需要注意的是入射光线和法线都需要归一化,R为折射率

旋转卡壳详解

匿名 (未验证) 提交于 2019-12-03 00:27:02
注:本文章参考自: https://blog.csdn.net/wang_heng199/article/details/74477738 基本问题为O(n)求凸n角形的 对踵点 ,而由该问题可以引申出许多的难题,他们包括: 计算距离 凸多边形直径 凸多边形宽 凸多边形间最大距离 凸多边形间最小距离 外接矩形 最小面积外接矩形 最小周长外接矩形 凸多边形直径 我们将一个多边形上任意两点间的距离的最大值定义为多边形的直径。 确定这个直径的点对数可能多于一对。 事实上, 对于拥有 n 个顶点的多边形, 就可能有 n 对“直径点对”存在。 一个多边形直径的简单例子如左图所示。 直径点对在图中显示为被平行线穿过的黑点 (红色的一对平行线). 直径用浅蓝色高亮显示。 显然, 确定一个凸多边形 P 直径的点对不可能在多边形 P 内部。 故搜索应该在边界上进行。 事实上, 由于直径是由多边形的平行切线的最远距离决定的, 所以我们只需要查询对踵点。 Shamos (1978) 提供了一个 O(n) 时间复杂度计算n点凸包对踵点对的算法。直径通过遍历顶点列表, 得到最大距离即可。 算法描述 1. 计算多边形y方向的端点,我们称之为 y m i n y m i n 和 y m a x y m a x 2. 通过 y m i n y m i n 和 y m a x y m a x 构造两条水平切线

[Unity优化]减少DrawCall:批处理

匿名 (未验证) 提交于 2019-12-03 00:27:02
参考链接: http://game.ceeger.com/Script/Mesh/Mesh.CombineMeshes.html 一、批处理 1.批处理的目的就是为了减少DrawCall。DrawCall即CPU命令GPU去绘制。 2.如果我们需要渲染一千个三角形,那么把它们按一千个单独的网格进行渲染所花费的时间要远大于直接渲染一个包含了一千个三角形的网格。 3.要想使用批处理,需要物体有相同的材质。这是因为,对于使用同一个材质的物体,它们的不同仅仅在于顶点数据的差别,我们可以把这些顶点数据合并在一起,再一起发送给GPU,就可以完成一次批处理。 4.在unity中,有两种批处理:一是动态批处理,二是静态批处理。 对于动态批处理,unity会自动完成,不需要我们进行操作,而且物体是可以移动的,但是动态批处理有许多限制条件。 对于静态批处理,物体不可移动,但是限制条件很少。 二、动态批处理 原理:每一帧把可以进行批处理的模型网格进行合并,再把合并后模型数据传递给GPU,然后使用同一个材质对其渲染。 限制: 1.顶点属性要小于900。例如,如果shader中需要使用顶点位置、法线和纹理坐标这三个顶点属性,那么要想让模型能够被动态批处理,它的顶点数目不能超过300。因此,优化策略就是shader的优化,少使用顶点属性,或者模型顶点数要尽可能少。 2.多Pass的shader会中断批处理。

第九讲 0.3

匿名 (未验证) 提交于 2019-12-03 00:26:01
当然同时增加的还有g2o相关的头文件和源文件:g2o_types.h和g2o_types.cpp EdgeProjectXYZ2UVPoseOnly 0.3版本只用到了第三种,也就是3D2D的重投影误差,所以只说一下第三种,其他两种也差不多: #ifndef MYSLAM_G2O_TYPES_H #define MYSLAM_G2O_TYPES_H #include "myslam/common_include.h" #include "camera.h" #include <g2o/core/base_vertex.h> #include <g2o/core/base_unary_edge.h> #include <g2o/core/block_solver.h> #include <g2o/core/optimization_algorithm_levenberg.h> #include <g2o/types/sba/types_six_dof_expmap.h> #include <g2o/solvers/dense/linear_solver_dense.h> #include <g2o/core/robust_kernel.h> #include <g2o/core/robust_kernel_impl.h> namespace myslam { class

shader1――图形硬件历史

匿名 (未验证) 提交于 2019-12-03 00:22:01
最枯燥的东西,看了忘,忘了还不想看......了解一下吧。 一、GPU发展简史 GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”,在现代计算机系统中的作用变得越来越重要。 20世纪六七十年代,人们只是从软件实现的角度考虑图形用户界面的规范问题,并没有GPU的概念。 20实际70年代末,GPU概念被提出,使用单片集成电路(mobilithic)作为图形芯片,GPU被用于视频游戏方面,只能够快速合成多张图片。80年代末,基于数字信号处理芯片(digital signal processor chip)的GPU被研发出来,速度更快,功能更强,价格昂贵。1991年,S3 Graphics 公司研制出第一个单芯片2D加速器,1995年,主流的PC图形芯片厂商都在自己的芯片上增加了对2D加速器的支持。 1998年NVIDIA公司宣布modern GPU的研发成功,标志着GPU的研发的历史性成为现实。20世纪70年代末到1998年的这一段时间称之为pre-GPU时期,而自1998年往后的GPU称之为 modern GPU。在pre-GPU时期,一些图形厂商,入SGI、Evans &Sutherland,都研发了各自的GPU,这些GPU在现在并没有被淘汰,依然在持续改进和被广泛的使用,当然价格比较昂贵。 modern GPU 使用晶体管(transistors

Android学习之OpenGL ES概述基础

匿名 (未验证) 提交于 2019-12-03 00:21:02
最近写一个有关视频的项目,需要用到GLSurfaceView,先自己琢磨琢磨。 在Android平台上使用OpenGL ES主要有两种方式:NDK和SDK。通过NativeActivity,应用在native(c/c++)中管理整个activity的声明周期,以及绘制过程。由于爱native代码中,可以访问OpenGL ES的代码,因此,可以认为NativeActivity提供了一个OpenGL ES的运行环境。同时,Android提供了两个可以运行在OpenGL ES的类:GLSurfaceView和TextureView。由于真正的OpenGL ES仍然运行在native在层,因此在performance上,使用SDK并不比NDK差。而避免了JNI,客观上对于APP开发者来说使用SDK要比NDK容易。而GLSurfaceView和GLSurfaceView.Renderer是使用OpenGL ES的基础: GLSurfaceView: 这个是我们使用OpenGL ES来进行绘制和操作的view,它和SurfaceView在功能上相似。 GLSurfaceView.Renderer: 这个接口定义了在GLSurfaceView上绘制的方法,我们必须将它实例化attach到GLSurfaceView。 onSurfaceCreated()

obj + mtl 格式说明

匿名 (未验证) 提交于 2019-12-03 00:08:02
OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包。该格式已被其他3D图形应用供应商采纳,是一种被绝大多数普遍公认的格式。 OBJ文件格式为简单数据格式,它仅表现3D几何体,即顶点的位置、以顶点列表方式定义每个多边形的顶点、法向量和面的UV坐标,以及纹理顶点。顶点默认以逆时针方向存储,不必显式声明法向。 1. 文件格式 注释行以#号起首 2. 面的定义 面通过顶点列表、纹理及法向的索引来定义。定义多边形(诸如四边形)时可超过三张顶点/纹理/法向索引。OBJ文件也支持自由曲面,如NURB(非均匀有理B样条)。 有多种方式定义一个面,然而每行面定义语句都以f起首。 2.1 顶点 合法的顶点索引从1开始,对应于预先定义的顶点列表中相应的顶点元素。每个面可以包含三个以上元素。 2.2 顶点/纹理坐标 可选地,纹理坐标索引可以用来指定面的纹理坐标。在定义一个面时,如需为顶点索引添加纹理坐标索引,须在顶点索引之后附上纹理坐标索引,并用/号分隔。注意/号之前或之后都不允许有空格。合法的纹理坐标索引从1开始,对应于预先定义的纹理坐标列表中相应的元素。每个面可以包含三个以上元素。 2.3 顶点/纹理坐标/法向 可选地,法向索引可以用来指定顶点的法向量。在定义一个面时

WebGL简易教程(四):颜色

匿名 (未验证) 提交于 2019-12-03 00:05:01
Ŀ¼ 在上一篇教程 《WebGL简易教程(三):绘制一个三角形(缓冲区对象)》 中,通过使用缓冲区对象(buffer object)来向顶点着色器传送数据。那么,如果这些数据(与顶点相关的数据,如法向量、颜色等)需要继续传送到片元着色器该怎么办呢? 例如这里给三角形的每个顶点赋予不同的颜色,绘制一个彩色的三角形。这个时候就需要用到之前( 《WebGL简易教程(二):向着色器传输数据》 )介绍过的varying变量了。 改进上一篇中绘制三角形(HelloTriangle.js)的代码: // 顶点着色器程序 var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + // attribute variable 'attribute vec4 a_Color;\n' + 'varying vec4 v_Color;\n' + 'void main() {\n' + ' gl_Position = a_Position;\n' + // Set the vertex coordinates of the point ' v_Color = a_Color;\n' + '}\n' ; // 片元着色器程序 var FSHADER_SOURCE = 'precision mediump float;\n' + 'varying vec4 v

Unity shader学习笔记(一)―― 渲染流程

匿名 (未验证) 提交于 2019-12-03 00:03:02
文章目录 渲染流水线 OpenGL 和 DirectX GPU做的事情 总结 渲染流水线 为了渲染一个模型,我们需要知道这个模型的每个顶点信息,有可能还需要知道由几个顶点构成的每个片元的颜色,这个颜色可能是直接指定的顶点颜色然后做的插值,也可能是用一张纹理“贴”上去,然后还要经过顶点变换,裁剪,等等操作,最后才渲染到屏幕上。为了加快这些步骤的执行,我们希望能够将这些步骤拆分成具体的几步,参考CPU指令流水线的思想,用流水线的思想加快执行。 在这些步骤中,可以分成两个部分。一部分在CPU上执行,一部分在GPU上执行。一开始模型的信息都存储在硬盘上,然后CPU要将其读取到内存中,之后设置一些渲染的状态(比如使用哪张纹理,顶点变换规则,颜色计算规则等等),然后将渲染状态和模型的顶点信息发送到显存,再发送一个指向该渲染状态的渲染命令 Draw Call ,通知GPU读取该渲染状态和模型顶点信息,开启第二部分的步骤绘制模型。而在第二部分中,又可以拆分出来两部分。总共三部分的步骤,分别如下: 应用阶段 几何阶段 光栅化阶段 其中应用阶段在CPU上执行,几何阶段和光栅化阶段在GPU上执行。这三个部分里面的十几个步骤(下文提及)最终构成了整个渲染流水线的元素。 注意上文提到的渲染命令,CPU有可能会发送多个,这些命令都会发送到一个命令缓存中,再由GPU一一读取。 OpenGL 和 DirectX