unity 渲染第二步
先不要用 unity shader 提供给你的转换矩阵,看看屏幕上的图形,你会学到更多。 --- 《unity 渲染箴言》
假设你 create 了一个 cube,放在默认的位置,默认的 rotation,默认的 scale,
此时,create 一个你自己的 material,再创建一个你自己的 unlit shader。将所有的东西赋予给你好了,现在写Shader "WANGSIYUAN/zijide{
// Properties {
// _Tint ("Tint", Color) = (1, 1, 1, 1)
// }
SubShader {
Pass {
CGPROGRAM #pragma vertex DingDianFunc
#pragma fragment HuaSanjiamianFunc #include "UnityCG.cginc" float4 _Tint; float4 DingDianFunc (float4 localp : POSITION) : SV_POSITION {
return localp;
} float4 HuaSanjiamianFunc (float4 screenp : SV_POSITION) : SV_TARGET {
return 1;
} ENDCG
}
}
}
那么结果是什么样呢?
如下图:
观察一下,得出以下结论:
1. localp 是local position,也就是说,以 cube 自己的中心为原点,看 cube 上的顶点,所得出的顶点位置的坐标。
2. 整个 cube 都是 长宽高 1,1,1的,而整个屏幕的 大小则是 2,2的(上一讲说过了,这里不包括z轴),所以,这里显示的等比例缩放的结果,所以,这个 cube看起来,是横着一半,竖着也一半。
3. 为啥是白色的,这是由于,HuaSanjiaomianFunc 里 直接 返回了 1,而1就是白色的。
4. 整个 cube 到底在什么地方,什么形状,完全由 DingDianFunc 函数的返回值,决定。
5. 直接将 localp 这种局部position输出,并没有让你感觉到 3D。因为你无论怎么拖动 camera,屏幕上都是这么一块白色的东西。
于是,很明显,我们需要,将 camera 的位置,cube 的位置和角度,所有的东西,全部传给 shader,然后计算出,真正好的顶点位置,我们将这个位置,称之为 screenp,也就是屏幕 position。-------这是个分隔符,下面马上要开始讲这个转换了。
来替换一下代码:
Shader "WANGSIYUAN/zijide"
{
// Properties {
// _Tint ("Tint", Color) = (1, 1, 1, 1)
// }
SubShader {
Pass {
CGPROGRAM #pragma vertex DingDianFunc
#pragma fragment HuaSanjiamianFunc #include "UnityCG.cginc" float4 _Tint; float4 DingDianFunc (float4 localp : POSITION) : SV_POSITION {
// return localp;
float4 aftermul = mul(UNITY_MATRIX_MVP, localp);
return aftermul; } float4 HuaSanjiamianFunc (float4 screenp : SV_POSITION) : SV_TARGET {
return ;
} ENDCG
}
}
}
那么产生的图:
嗯,已经有了位置感,和大小感了,不信你试着去 scene 里面转动一下,cube,或者转动一下 camera,已经有效果了。
注意一下,aftermul 这个 float4类型的变量。这个 aftermul 是齐次坐标的。哦,好的,你不知道什么叫做齐次坐标。那么简单来讲讲吧,那就是,x,y,并不是你最终发现在屏幕上的x,y,而是要除以 w。
举个例子,(0.5, 0.5, 1, 2)这个点,应该在屏幕上什么位置呢?
答:首先忽略z坐标,因为屏幕是二维的,z没用,那么就剩下,x=0.5,y=0.5,w=2。根据上一讲,屏幕是2乘以2的,屏幕的中心是原点,那么很明显,(0.5 0.5)就应该在 :
这个位置,但是你错了,,,应该把x和y再除以 w,,才对,,,,也就是(0.25, 0.25)这个位置,
如果你想知道为啥这么搞,很不幸,你将学一学矩阵了,这不是本篇所涵盖的内容。反正,就是应该如下图:
,
绿点的位置,才是(0.5,0.5,1,2)这个 float4 应该的位置。总之,就要把,得出的 aftermul 这个结果,的x和y再除以 w,才是屏幕上真正的位置。
unity 渲染第二步的更多相关文章
- unity渲染层级关系小结(转存)
最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来. Unity中的渲染顺序自上而下大致分为三层. 最高层为Camera层,可 ...
- unity 渲染第一步
unity 不是将宇宙投影到水晶球里,而是:将整个 view frustum 投影成 一个 cube .------ <unity 渲染箴言> 观察一下,整个 view frustum 以 ...
- unity渲染层级关系小结
http://blog.csdn.net/meegomeego/article/details/42060389 最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这 ...
- Unity 渲染教程余下
可能来源于(英文):https://catlikecoding.com/unity/tutorials/ Unity渲染教程(一):矩阵 http://gad.qq.com/pro ...
- Unity 渲染教程(五):多个光源
https://www.jianshu.com/p/c1a9a5d27765 对每个物体渲染多个光源的光照效果. 支持不同的光源类型. 使用光源cookie. 计算顶点光照. 在光照计算中添加球面谐波 ...
- Unity 渲染流水线 :CPU与GPU合作创造的艺术wfd
前言 对于Unity渲染流程的理解可以帮助我们更好对Unity场景进行性能消耗的分析,进而更好的提升场景渲染的效率,最后提升游戏整体的性能表现 Unity的游戏画面的最终的呈现是由CPU与GPU相互配 ...
- Unity渲染优化中文翻译(三)——GPU的优化策略
如果游戏的渲染瓶颈来自于GPU 首要任务就是找出造成GPU瓶颈的因素所在,通常GPU的性能受到像素分辨率的影响,特别是在移动客户端的游戏,但是内存带宽和顶点计算的影响也需要注意.这些因素的影响都需要实 ...
- Unity渲染优化中文翻译(二)——CPU的优化策略
紧接上一篇文章,继续渲染的优化问题,若有错误,请指出,让我也学习进步,谢谢. 如果游戏渲染问题来自CPU 概括的来说,CPU在一帧的渲染中的工作可以分为三个部分: . 决定谁需要被渲染 . 为GPU准 ...
- Unity渲染优化中文翻译(一)——定位渲染问题
最近有一点个人的时间,尝试一下自己翻译一下英文的 Optimizing graphics rendering in Unity Games, 这儿附上英文链接: 个人英文水平有限,unity图像学知识 ...
随机推荐
- 我为什么要翻译ES6官方文档
ES6出来很久了,现在网上也有很多教程,其中以阮一峰老师的教程最为经典.大家通过学习阮老师的教程肯定能学懂ES6最新的技术. ES6官方文档是一个规范,各浏览器在实现ES6的具体API时都会遵循它.我 ...
- 【Windows】ASP.NET Core 部署到 IIS
如果你的系统环境没有 .NET CORE SDK,请到官网进行下载: https://www.microsoft.com/net/download/windows 接下来我们开始进行环境的部署,首先在 ...
- 一个简单的编译tex的Makefile
tex编译成pdf通常要经过以下步骤:tex-->dvi-->ps-->pdf.如果修改了tex文件想看一下效果,就要把命令重新敲一遍.虽然就几行命令,反复敲还是很烦人的.最直接的办 ...
- Tomcat之Web站点部署
上线代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了.第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面.下面让我们 ...
- C++裁剪文件,截断文件,_chsize()
errno_t _chsize_s( int fd, __int64 size ); 详见msdn知识库 _chsize将文件裁剪为指定大小,大小的度量方法与 long ftell(FILE * fp ...
- How can i use iptables on centos 7 or fedora?
http://stackoverflow.com/questions/24756240/how-can-i-use-iptables-on-centos-7 # sudo service iptabl ...
- python基本算法
算法优劣评判标准 时间复杂度: 定义:用来评估算法运行效率的一个式子 print('Hello World') O(1) for i in range(n): print('Hello World') ...
- 「AH2017/HNOI2017」礼物
题目链接 戳我 \(Solution\) 应为我们可以将任意一个数列加上一个非负整数,即可以变为将一个数列加上一个整数(可以为负),我们将这个整数设为\(z\).所以要求的式子的变为: \[\sum_ ...
- C++中引用的形参使用
引用解释: (1)引用仅是变量的别名,而不是实实在在地定义了一个变量,因此引用本身并不占用内存,而是和目标变量共同指向目标变量的内存地址,即共用内存 (2)引用和目标变量的地址是一样的,对引用的操作与 ...
- php 调用银联接口 【转载】
首先要开启openssl开启方法为 openssl证书放在Apache的bin目录中. 其中的php_openssl.dll,ssleay32.dll,libeay32.dll,3个文件拷到windo ...