突然遇到的shader model标准

大晚上的写个shader不容易 突然给我爆出个error具体如下
这里写图片描述
网上查了下 说是使用显卡寄存器超了?
嘛呢!我的显卡可是两千多大洋买的好不好?次世代游戏都全特效无卡顿,用了一个循环就超了?
下面这是我的代码突然遇到的shader model标准_第1张图片
我用我的手指头和脚趾头算了一下
for循环了9次..所以超了
错误是Temporary register limit of 8 exceeded; 超过临时寄存器8个限制,嘛呢!为毛每个shader我只能用8个寄存器!一个循环9次的结构都给我挂了。

先不管它,还有个error要哭了有没有: Arithmetic instruction limit of 64 exceeded; 算数指令超过64个限制,。。。我做了个简单的加法乘,发现确实超过了!嘛呢!才64个加减乘除,每个循环才只能赋值或者加减乘除7次?要人命啊,我的shader里包含的只是采样而已,还没加上一些复杂的操作呢!(看来以后只能放compute shader?)

然后查了下应对方法
只要增加申明#pragma target 3.0 即可,原来这些限制都是 shader model 2.0的。笔者好奇的想知道这狗日的2.0到底有多少限制于是…看下图
突然遇到的shader model标准_第2张图片
突然遇到的shader model标准_第3张图片
表中:PS 2.0 = DirectX 9.0 original Shader Model 2 specification。
PS 2.0a = NVIDIA Geforce FX-optimized model。
PS 2.0b = ATI Radeon X700 X800 X850 shader model,DirectX 9.0b。
PS 3.0 = Shader Model 3。
PS 4.0 = Shader Model 4。
N = NO,Y = YES。
“32+64”指32个纹理指令和64个算术指令。

原来fragment shader和pixel shader还是分开的喔?是不同的标准,合起来成为shader model 2.0 3.0 4.0 5.0,表格比较老所以没有shader model 5.0的 下面是5.0的百度百科

Shader(译为渲染或着色)是一段能够针对3D对象进行操作、并被GPU所执行的程序,ShaderModel的含义就是“优化渲染引擎模式”,我们可以把它理解成是GPU的渲染指令集。历代DirectX每逢重大版本升级时最主要的更新内容就包括在了ShaderModel之中:
ShaderModel 1.0 → DirectX 8.0
ShaderModel 2.0 → DirectX 9.0b
ShaderModel 3.0 → DirectX 9.0c
ShaderModel 4.0 → DirectX 10
ShaderModel 4.1 → DirectX 10.1
ShaderModel 5.0 → DirectX 11
高版本的ShaderModel是一个包括了所有低版本特性的超集,对一些指令集加以扩充改进的同时,还加入了一些新的技术,现在我们就来看看DX11 SM5.0都有哪些新特性:
由于统一渲染架构的特性,Shader Moder 5.0是完全针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull和Domaim(位于Tessellator前后)都将从新指令集中获益。
特性1:覆盖采样
功能:直接为像素着色器输出覆盖采样信息。
效果:边缘侦测更加精确,抗锯齿运算效率和效果更佳。
特性2: Gather 函数加速纹理拾取
功能:在一个纹理指令里读取4点采样值,可针对特定颜色分别采样,自动识别能做阴影映射的值。
效果:更快,更好的阴影过滤实现环境光遮蔽(SSAO)。
特性3:粗糙偏导数
功能:用数学函数定义简单的二维纹理图案,如方格地毯或用数学函数定义随机高度场,生成表面粗糙纹理及几何纹理。
效果:高性能,高画质纹理过滤。
特性4:类型转化类指令
功能:将数据值在32bit浮点,和16bit浮点直接相互转换。
效果:简单高效译码双精度支持。
特性4:位操作类指令
功能:转位、排序、封包、压缩、解压。
效果:数据压缩解压缩速度提升,传输率提高。
其中,覆盖采样及Gather4纹理拾取两项指令是从在DX10.1基础上发展而来的,SM5.0要比SM4.1更加智能和灵活,它可以针对特定颜色分别采样、还能自动识别可做阴影映射的值,精度和效率都进一步提高。
由于DX10.1与DX10在指令方面的相似性,现有的DX10.1游戏可以很容易的通过更新程序代码升级支持DX11,从而获得更好的运行效率,比如《风起云涌》、《潜行者》、《科林麦克雷》将会率先引入DX11。

笔者写这篇文章在2015/7/13,这个时代(好有时空穿越的感觉)已经有了DX11,unity3d在最快的时间就支持了unity3d 5.X版本…

回到正题 所以我们只要定义下#pragma target (版本号)2.0/3.0/4.0/5.0 即可
shade model是一个标准,允许你在特定的驱动DX10/11上编写具有其限制当然还有特性的代码。仅此而已,只是个标准。
那一般这个时代的手机(又来囧)iphone6,ipad air,或者小米4,魅族5一般系统和硬件都支持到3.0左右甚至3.0,2.0是DX9,3.0是DX9c,这两个标准(笔者打游戏比较多,所以也踏入了游戏行业,本来一开始出道我是三维模型算法出生,又写了几个引擎,后来遇到个女孩叫妈妈说女孩….偏题好严重)Dx9差不多已经是刺客信条1代(这个时代的大作)的标准,这个游戏是ps3/xbox360上的主机平台游戏.所以效果可想而知,还是不错的,而2.0就惨不忍睹了,Dx8可是ps2时代的产物了.. 挺糟糕的,然后笔者又不经想起 著名的战神系列..sony大法好! psp上也有奥林匹斯之链的游戏 画面那个赞
突然遇到的shader model标准_第4张图片
ps2画面
突然遇到的shader model标准_第5张图片

下面是psp 战神 奥林匹斯之链的画面

想想那个时代的程序员仅仅只能用8个寄存器,64条算数语句就创造出如此画面,不经让人感觉肃然起敬!
当然跨入了DX11时代的2015,画面是这个样子的
突然遇到的shader model标准_第6张图片

战神系列一直被誉为压榨机器最后一点性能不是没有道理的..
在有限的硬件条件下创造出奇迹才是程序员的天职。 作为结语

你可能感兴趣的:(突然遇到的shader model标准)