顶点坐标

优化

非 Y 不嫁゛ 提交于 2019-12-13 12:41:37
WeTest 导读 做了大概半年多VR应用了,VR由于双眼double渲染的原因,对性能的优化要求比较高,在项目的进展过程中,总结了一些关于移动平台上Unity3D的性能优化经验,供分享。 一、移动平台硬件架构 移动平台无论是Android 还是 IOS 用的都是统一内存架构,GPU和CPU共享一个物理内存,通常我们有“显存”和“内存”两种叫法,可以认为是这块物理内存的所有者不同,当这段映射到cpu,就是通常意义上的内存;当映射到gpu,就是通常意义上的显存。并且同一段物理内存同一时刻只会映射到一个device。 即使是在同一物理内存上 ,之前的openGL ES规范中CPU和GPU之间的内存是不能共享的,vertex和texture的buffer是需要拷贝的。后面出来的vulkan 与IOS的metal 可以共享内存。 了解了移动平台的硬件架构,就知道了 1)CPU 2) 带宽 3) GPU 4) 内存 都有可能成为移动平台3D应用性能瓶颈。 二、移动平台3D应用的画面渲染过程 1、CPU通过调用绘制命令(称为一次Draw Call)来告诉GPU开始进行一个渲染过程的。一个Draw Call命令会指向本次绘制需要渲染的信息,这些信息包括:顶点数据、纹理数据、shader参数(光照模型、法线方向、光照方向等)等,简单地说就 画什么,用什么画,怎么画。 2、GPU接收到Draw

我的webgl学习之路(五)用webgl画彩色三角形

别等时光非礼了梦想. 提交于 2019-12-08 14:16:35
要想做彩色三角线必须知道uniform、attribute、varying这三个声明; uniform 表示一次渲染过程中保存不变的 attribute 表示是实时在改变的 varying 用来着色器之间的通讯,也就是顶点着色器和片段着色去之间的桥梁 还需要注意的是varying 在顶点和片元着色器两个中都声明一个一样的变量;那么它就会自动默认,两个有关系,但并不是相同的;片元着色器中得到的varying 是经过插值运行得到后的值;要想改变三角形的颜色,就得改变顶点颜色,它是通过顶点的颜色,来进行计算的;就以线来说:两个顶点的颜色不同,那么中间的颜色怎么办,只能通过两端点的颜色进行插值计算;怎么插值,就像渐变一样,想象一下,在取色器中,连接任意两个点,它是不是是以一种渐变的方式进行变化;这些计算方式都是渲染管进行自动计算,你只需要把顶点额颜色传入; 代码如下: <!DOCTYPE html > < html lang= "en" > < head > < meta charset= "UTF-8" > < title > 多彩三角形 </ title > < script src= "../js/minMatrix.js" ></ script > < script id= "vs" type= "x-shader/x-vertex" > attribute vec3

20 WebGL使用纹理贴图

ⅰ亾dé卋堺 提交于 2019-12-08 14:14:35
案例查看地址: 点击这里 WebGL中纹理的限制 WebGL中的纹理需要注意一点,所使用的图片数据的大小必须是2的阶乘,横竖的像素长度大小必须是32x32,128x128等2的阶乘的形式。 当然,做一些处理的话,不是2的阶乘的图片数据也是可以用的,但是基本上作为纹理使用的图像数据的大小必须是2的阶乘。 另外,看一下普通的网页就能感觉到,网页上的图片数据的读取是要花一点时间的,在进行纹理转换的话,必须是在图片读取完之后才行,这里需要做一些特殊的处理,如果对 JavaScript 不太熟悉的话可能会无从下手,这个后面会说。 为什么需要纹理? 因为不可能所有的图像都靠代码生成,那是在浪费生命。 这一部分由于WebGL的安全机制,必须开启服务获取,或者允许浏览器访问本地文件,要不然WebGL无法获取文件。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge">

WebGL学习系列-基本图形变换

北城以北 提交于 2019-12-08 14:14:18
前言 经过前面的学习,我们已经可以绘制基本的图形了。本小节将介绍基本的图形变换,介绍在WebGL中,如何对基本的图形进行平移、旋转和缩放。 平移 在前面的小节中,我们已经绘制过一个三角形,那时候,它看起来是这样的: 我们知道,在WebGL中,要绘制一个基本的图形,我们只需要指定顶点的位置、大小和颜色,然后调用drawArrays接口进行绘制即可。现在,我们想要实现对三角形进行一个平移,比如,把它移到右上角的地方,那如何实现呢? 其实仔细想想,你会发现,我们要移动一个三角形,只需要移动它的三个顶点即可,然后WebGL将会自动在新的顶点位置把三角形绘制出来。 其原理示意图如下: 为了进一步说明在程序中是如何实现平移的,我们先来看下顶点着色器代码: // 顶点着色器代码(决定顶点的位置、大小、颜色) var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'uniform vec4 u_Translation;\n' + 'void main() {\n' + ' gl_Position = a_Position + u_Translation;\n' + // 设置顶点的位置 ' gl_PointSize = 10.0;\n' + // 设置顶点的大小 '}\n' ; 主要看到两个地方有所变动 : 1、添加了 uniform vec4

光照演示程序(第八章内容)

a 夏天 提交于 2019-12-05 05:30:20
光照演示程序(第八章内容) 8.14、光照演示程序 本章演示程序基于上一章的“陆地与波浪演示程序”的基础上构建而成的,其中利用了一个方向光来表示太阳,用户可以使用方向键来控制太阳的方向。 8.14.1、顶点格式 光照的计算需要依赖于表面法线,所以我们会 在顶点层级定义法线 ,方便在光栅化过程中进行插值计算,由此展开逐像素光照。同时我们也 不需要指定顶点的颜色 ,而是以每一个像素应用光照方程之后所生成的像素颜色代替指定顶点颜色。下面是顶点结构体: //c++顶点结构体 struct Vertex { DirectX::XMFLOAT3 Pos; DirectX::XMFLOAT3 Noraml; } //对应的HLSL顶点结构体 struct VertexIn { float3 PosL : POSITION; float3 NormalL : NORMAL; } //新的输入布局描述 mInputLayout = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER

OpenGL Three (Shader__GLSL)

核能气质少年 提交于 2019-12-04 17:57:33
着色器(Shader) 在之前的随笔中说过, 着色器(Shader)是运行在GPU上的小程序 。从基本意义上来说,着色器只是一种把输入转化为输出的程序。 着色器之间很独立 ,唯一的共同方式就是通过输入和输出 GLSL 一个典型的着色器有以下的结构 #version version_number in type in_variable_name; in type in_variable_name; out type out_variable_name; uniform type uniform_name; int main() { // 处理输入并进行一些图形操作 ... // 输出处理过的结果到输出变量 out_variable_name = weird_stuff_we_processed; } VertexShader:输入变量也叫 顶点属性( Vertex Attribute ) 。要特别注意以下,我们能声明的顶点属性是有上限的。OpenGL确保至少有 16个包含4个分量的顶点 属性可用。 ( 可以通过GL_MAX_VERTEX_ATTRIBS获取 )。 int nrAttributes; /* 大部分情况下16个够用了,要啥自行车。 /抠鼻 */ glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nrAttributes); cout <<

OpenGL One (Triangle)

不羁的心 提交于 2019-12-04 14:42:07
前言: 虽然C++是个语法及其憨批的语言( 菜是原罪 ),但确实是入门OpenGL这门技术的不二之选。 Tips 顶点数组对象:Vertex Array Object,VAO 顶点缓冲对象:Vertex Buffer Object,VBO 索引缓冲对象:Element Buffer Object,EBO 或Index Buffer Object,IBO 一点点基本的概念 3D坐标转为2D坐标是通过OpenGL的 图形渲染管线 管理的。 图形渲染管线可以被划分为两个主要部分: 第一部分是把3D坐标转换为2D坐标 第二部分是把2D坐标转换为实际有颜色的像素 注意:2D坐标和像素不同,2D坐标精准表示一个点在2D空间种的位置,而2D像素是这个点的近似值,2D像素收到你的屏幕分辨率的限制。 管线接受特定的3D坐标,然后把他们转变成屏幕上的有色2D像素输出。图形渲染有很多阶段,每个阶段都是高度专门化的,有一个特定的函数处理。 当今显卡都有很多核心,在GPU上为每一个管线的极端运行各自的小程序,快速处理数据,这些小程序就叫 着色器(shader) 。OpenGL的着色器是使用着色器语言 GLSL 。 (蓝色的部分是可以自己写入着色器的部分)Vertex Shader && Fragment Shader 必须写 Vertex Shader:作为单独的定点作为输入。 Fragment

【数字图像处理】仿射变换与透视变换

不羁岁月 提交于 2019-12-04 14:27:20
仿射变换与透视变换   仿射变换和透视变换更直观的叫法可以叫做「平面变换」和「空间变换」或者「二维坐标变换」和「三维坐标变换」。一个是二维坐标(x,y),一个是三维坐标(x,y,z)。也就是: 仿射变换: 透视变换:   从另一个角度也能说明三维变换和二维变换的意思,仿射变换的方程组有6个未知数,所以要求解就需要找到3组映射点,三个点刚好确定一个平面。透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。   仿射变换和透视变换的数学原理也不需要深究,其计算方法为坐标向量和变换矩阵的乘积,换言之就是矩阵运算。在应用层面,放射变换是图像基于3个固定顶点的变换,如图1.1所示:   图中红点即为固定顶点,在变换先后固定顶点的像素值不变,图像整体则根据变换规则进行变换同理,透视变换是图像基于4个固定顶点的变换,如图1.2所示:   在OpenCV中,放射变换和透视变换均有封装好的函数,分别为: void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar()) 与 void

陆地与波浪演示程序(第七章内容)

旧城冷巷雨未停 提交于 2019-12-04 11:58:14
7.7、陆地与波浪演示程序 在本小节中,我们将展示如何构建“陆地与波浪”演示程序: 构建一个三角形栅格(grid),并通过将其中的顶点设置到不同的位置来创建 地形 再构建一个三角形栅格(grid),通过动态的改变其顶点高度来创建 波浪 此示例还会 针对不同的常量缓冲区来切换所使用的根描述符 ,这可以让我们不需要设置CBV描述符堆 7.7.1、生成栅格顶点 为了生成地形和波浪,我们首先要构建三角形栅格(grid),这里我们不进行详细的数学分析,直接给出结论: \[ 在xz平面上,第i行、第j列栅格顶点的坐标可以表示为:v = [-0.5w + j*dx, 0.0f, 0.5d - i*dz] \] 其中w为栅格的总宽度(宽),dx为每一个小四边形的宽度,d为栅格的总深度(长),dz为每一个小四边形的深度, (其实可以把栅格理解成一个由许多小四边形组成的大四边形) 下面是生成栅格顶点的代码: /* ** Summary:生成栅格顶点 ** Parameters: ** width:栅格的宽度 ** depth:栅格的深度 ** m:行数 ** n:列数 ** Return:栅格的网格数据 */ GeometryGenerator::MeshData GeometryGenerator::CreateGrid(float width, float depth, uint32 m,

可编程渲染管线与着色器语言

有些话、适合烂在心里 提交于 2019-12-03 20:10:01
Programming pipeline & shading language 大家好,今天想给大家介绍一下可编程渲染管线和着色器语言的相关基础知识,使想上手SHADER编程的童鞋们可以快速揭开SHADER语言的神秘面纱 由于时间有限,我决定只讲三个主要方面的内容,其过程中肯定会有不详细之处,还请见谅,就算是抛砖引玉,给大家一个简单的入门引路。 本章内容总共分为三个部分 一、3D渲染管线工作流程 二、可编程管线 三、着色器语言 3D渲染管线作为整个工作流程的基础,是不可或缺的基本知识。因此,作一定的讲解是有必要的。 但作为一个回顾内容,就不会对具体的内容进行讲解,比如如何进行坐标系变换,如何进行光栅化等等。 我们仅关注的是整个工作的过程。 甚至,我们更关心的不是整个工作过程中的细节,而是我们所必须要关注的几大流程。 如下图 数据填充 当我们想实现一次渲染效果的时候,数据的提交(填充)是不可缺少的。 因此,工作流程的第一步就是要处理输入的数据。 而我们最直接的接触3D渲染流程的时机,也就是数据填充时,更确切的说,就是那一堆set数据的API。 数据填充允许我们提交我们想要的数据,比如顶点数据(如位置,法线,颜色,纹理坐标等)。常量(如世界矩阵,观察矩阵,投影矩阵,纹理因子等等)。 变换&顶点光照 在这个阶段,顶点会经过世界变换,观察变换,投影变换。 通常情况下,在顶点经过观察变换后