Unity的GPU编程问题解析

在游戏蛮牛知识问答里面经常有人询问关于Unity中的Shader编程方面的函数问题,GPU编程其实就是把固定流水线的各种矩阵变换放到了GPU里面进行。

下面给大家主要介绍一些基本的常识:

我们在Shader编程中经常使用 Vertex & Fragment Shaders,通过举例说明:

struct Vert {  
    float4 vertex : POSITION;  
    float3 normal : NORMAL;  
    float4 texcoord : TEXCOORD0;  
};  
Vert Input(Vert v) {  
    Vert o;  
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);  
    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  
    o.color = ShadeVertexLights(v.vertex, v.normal);          
    return o;  
}

结构体Vert是定义的vertex program作为输入。接下来解析一下Input函数

o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

意思是把顶点的位置和Unity提前定义的一个矩阵UNITY_MATRIX_MVP(在UnityShaderVariables.cginc里定义)相乘,从而把顶点位置从model space转换到projection space。我们使用了矩阵乘法操作mul来执行这个步骤。

o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);

纹理计算其uv坐标,即根据mesh上的uv坐标来计算真正的纹理上对应的位置。我们使用了Unity.CG.cginc中的宏TRANSFORM_TEX来实现。

宏TRANSFORM_TEX的定义:#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)。我们需要在shader中定义一些额外的变量,即必须定义一个名为_YourTextureName_ST (也就是你的纹理的名字加一个 _ST后缀)。

Unity使用了三个数据来定义顶点光源:unity_LightPosition,unity_LightAtten和unity_LightColor。例如[0]表示最重要的光源。

当编写一个multi-pass的光照模型时,只需要一次处理一个单独的光源,这种情况下,Unity同样定义了一个名为_WorldSpaceLightPos0的值,来帮助我们得到它的位置,并且还提供了一个非常有用的函数ObjSpaceLightDir,它可以计算得到该光源的方向。而为了得到该光源的颜色,我们可以在程序中包含“Lighting.cginc”文件,然后使用_LightColor0进行访问。

接下来介绍一下Unity.CG.cginc包含的宏的解释:

TANGENT_SPACE_ROTATION(在UnityCG.cginc里定义)是用来来创建一个名为rotation的矩阵,并使用它把object space转换到tangent space中。

TRANSFER_VERTEX_TO_FRAGMENT宏,它在AutoLight.cginc里定义,它会根据该pass处理的光源类型(spot,point,or directional)来计算光源坐标的具体值,以及进行和shadow相关的计算等。

最后:我们在写Shader的时候,可以定义多个passes,其中每一个pass处理一个光源。一个Pass可以为该阶段定义一系列的tags。

时间: 2024-11-05 15:57:02

Unity的GPU编程问题解析的相关文章

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效

蛋哥的学习笔记之-基于Unity的Shader编程:X-1 音乐水波特效 热度 13728 2015-7-11 23:34 |个人分类:蛋哥的学习笔记之-基于Unity的Shader编程| 音乐, Unity, Shader, 水波, Shader, Shader, Shader, Shader 一.要干些啥: 很久很久没有写文档了,前段时间做了个个人很喜欢的,自认为比较原创的小特效,所以写个文档纪念下(本人特别喜欢音乐) 思路其实很简单,首先用顶点着色器实现一般的水波特效,然后解析音频数据(我

cg语言学习&&阳春白雪GPU编程入门学习

虽然所知甚少,但康大的<GPU编程与Cg编程之阳春白雪下里巴人>确实带我入了shader的门,在里面我第一次清晰地知道了"语义"的意思,非常感谢. 入门shader,我觉得可以先读3本书:<GPU编程与Cg编程之阳春白雪下里巴人>=><cg教程>=><Real-Time Rendering 3rd>(在读,最近忙,搁下了),打下理论基础. 下面是<cg教程>的读书笔记. 1.基本cg函数 1)数学函数:abs,ac

GPU编程中的常用数学函数

在GPU编程中,函数一般分为以下几种类型:数学函数.几何函数.纹理映射函数.偏导数函数.调试函数等.熟练利用好GPU自带函数,可以在一定程度上提高并行编程速度与效率. 关于数学数学函数(Mathematical Functions) 数学函数用于执行数学上常用计算,比如:三角函数.幂函数.向量和矩阵函数,这些函数一般都被重载,用来支持标量数据和不同长度的向量作为输入参数.列表如下: 标准函数库中的数学函数 未完待续......

项目优化之:GPU编程

 1GPU编程,依赖于显卡 2GPU变成依赖于OpenGL和direct 3CPU的特点是:频率比较快,GPU的特点是寄存器非常非常的多. 4如果电脑是windows7,没法直接调试GPU.Window8可以直接调试 5用VS2013新建一个项目,命名:GPU 6调试GPU的方式是VS中的:打断点->运行项目à调试à窗口àGPU线程(通过这种方式实现调试GPU项目) 8.修改项目属性:右击项目à属性à配置属性à常规,修改调试器类型为仅GPU 修改Amp默认快捷键可以选择时时(Use C++

一 GPU 编程技术的发展历程及现状

前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础工作的. 该系统架构简单来说就是处理器从存储器中不断取指,解码,执行. 但如今,这种系统架构遇到了瓶颈:内存的读写速度已经跟不上 CPU 的时钟频率了.具有此特征的系统被称为内存受限型系统,目前的绝大多数计算机系统都属于此类型. 为了解决这个问题,传统的解决方案是使用缓存技术.通过给 CPU 设立多级缓存,能够大

GPU 编程入门到精通(五)之 GPU 程序优化进阶

博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识.鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程. 有志同道合的小伙伴,欢迎一起交流和学习.我的邮箱: [email protected] .使用的是自己的老古董笔记本上面的 Geforce 103m 显卡,尽管显卡相对于如今主流的系列已经很的弱,可是对于学习来说.还是能够用的.本系列博文也遵从由简单到复杂,记录自己学习的过程. 0. 文件夹 GPU 编程入门到精通

GPU 编程 global memory 的使用

最近做作业,发现了一个一直不理解的问题终于明白了,高兴! block只是用来划分task. block和device memory 访问没有对应关系. block可以访问任一device memory的内容. 之前,以为block只能访问划分给它的那块数据!! 比如以前提过的两矩阵乘法, 矩阵小块可以除了访问该矩阵小块对应的device memory,还访问了同一列分区和同一行分区的 device memory. 但是,block在写device memory的时候,就需要注意了! 总之: bl

第一篇:GPU 编程技术的发展历程及现状

前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构简单来说就是处理器从存储器中不断取指,解码,执行. 但如今这种系统架构遇到了瓶颈:内存的读写速度跟不上 CPU 时钟频率.具有此特征的系统被称为内存受限型系统,目前的绝大多数计算机系统都属于此类型. 为了解决此问题,传统解决方案是使用缓存技术.通过给 CPU 设立多级缓存,能大大地降低存储系统的压力

GPU 编程入门到精通(四)之 GPU 程序优化

博主因为工作其中的须要,開始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程.因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴.欢迎一起交流和学习,我的邮箱: [email protected] . 使用的是自己的老古董笔记本上面的 Geforce 103m 显卡,尽管显卡相对于如今主流的系列已经很的弱.可是对于学习来说,还是能够用的.本系列博文也遵从由简单到复杂.记录自己学习的过程. 0. 文件夹 GPU 编程入门到精通