array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 CG注意事项 - 爱码网

本篇博客主要用来记录在编写CG时应该注意的一些特殊情况,方便避免采坑。

1.CG中的数组必须给定明确的初始化大小,否则结果未知。重新打开工程时会出现升级代码。如图所示:
CG注意事项
2.可以将cg中用到的辅助接口整理在同一个任意后缀名的文件中,并放入到unity的CGIncludes目录下。需要用这些接口时,只需要使用include进行包含进来就可以。如图所示:
CG注意事项
3.CG中in参数语义不能存在相同,out参数和return变量也不能存在相同语义,struct中的变量也不能存在相同语义。且在使用时,最好按照源类型和语义进行输入和输出,不能自认为拆解结构体来自动适配。如图所示:
CG注意事项
在片段着色器中接收顶点着色器中的输出v2f类型变量时,只能使用v2f来接收,不能自作聪明和用v2f中的成员来接收。

4.shader是无法对模型原始顶点数据进行修改的,unity只是将顶点数据做了一份拷贝给我们使用,修改的顶点数据也是拷贝后的顶点数据。如图所示:
CG注意事项
5.CG当中的mul接口表示表示第一个参数来影响第二个参数。如果第二个参数是矩阵的话,表示先进行第二个参数的矩阵操作,然后再进行第一个参数的矩阵变换。如果第二个参数是向量的话,就是直接对第二个参数进行第一个参数的矩阵变换。

6.向量B减去向量A会得到一个由A指向B的向量。如图所示:
CG注意事项
7.向量之间的叉乘得到的结果是垂直于向量之间平面的法向量。此时可以采用左手法则,使用左手大拇指朝向我们,其余四指弯曲方向来决定向量叉乘先后顺序时,得到的法向量是朝向我们的。使用左手大拇指朝下远离我们,其余四指弯曲方向来决定向量叉乘先后顺序时,得到的法向量是远离我们的。且法向量朝向我们表示平面正面朝向我们,法向量远离我们表示平面背面朝向我们,所以在计算光照时,我们是希望得到朝向我们的法向量。如图所示:
CG注意事项
8.在光照计算中,通常是使用法向量和光照向量(顶点指向光的方向)之间进行计算。通过将这两个向量归一化后进行点积操作,可以得到两个向量之间的夹角余弦值就等于两者之间的点积值。从而可以得出:法向量和光照向量之间角度越小,光照越强,向量重合时光照最强,向量垂直时光照最弱。如图所示:
CG注意事项
9.在在Forward渲染路径下计算点光源颜色时,可以使用光照模型为Vertex的ShadeVertexLights接口进行计算,也可以使用光照模型为ForwardBase的Shade4PointLights接口进行计算。具体方法的使用参考unitycg.cginc和unityshadervariables.cginc文件中的定义。

10.顶点着色器和片段着色器处理颜色特点:
1>.片元是由顶点所在三角形面细分得到的,所以模型顶点集合数量要远远小于片元集合数量。在处理颜色时,顶点着色器中处理速度会更快些。
2>.顶点着色器只是对模型顶点进行处理,顶点和顶点之间的区域由系统自动进行插值处理。而片段着色器是对模型中所有的像素进行处理,所以片段着色器中处理颜色会更加细腻。
3>.在片段着色器中处理颜色时,需要将光照强度相关计算也放在片段着色器中。因为顶点中进行光照强度计算是针对一个顶点的,当该顶点细分成多个片元时,在片元中用顶点中获取的光照强度是一样的,这样就没有进行插值处理,得到的颜色值也将是一样的,效果看起来就不够平滑。当把光照强度计算放在片元着色器中时,图形硬件会在相同顶点不同片元处做插值计算处理,从而得到的颜色是有插值变化的,效果看起来就更加平滑。

11.由于gpu中逻辑运算单元有限,在顶点或者片段着色器中进行条件判定时性能会十分损耗,此时可以使用lerp插值函数来替换条件判定。因为lerp参数规则为“参数1乘以(1 - 参数3) + 参数2乘以参数3”,所以当参数3为1时,取参数2结果,当参数3为0时,取参数1结果。

12.我们可以对1~4维纹理对象进行采样。其中采样采样接口分别为tex1D,tex2D,tex3D,texCUBE。采样对象分别为:sampler,sampler2D,sampler3D,samplerCUBE。采样坐标分别是x,xy,xyz,xyzw。同时采样坐标等于纹理原始采样坐标乘以缩放系数再加上偏移系数,如果采样坐标在采样坐标空间系中存在的话,就回得到一个有效的像素,否则就是无效未知的像素。而采样坐标对应位置的像素获取又根据纹理过滤模式来获取,当过滤模式为点类型的话,就会获取一个就近的整数像素值,当过滤模式为线性的话,就会获取周围像素按照权重累加的像素值。

13.pass中的colormask指令是用来保留指定颜色分量的命令。如:colormask rgb就是输出颜色的红绿蓝分量值,此时的透明度分量值不被输出。

相关文章: