shader 4 杂 一些和函数名词、数据结构

shader 4 杂 一些和函数名词、数据结构

Normal:  法线

Normao mapping: 法线贴图

Lighting mapping: 光照贴图

Bump mapping:     凹凸贴图;模拟粗糙外表面的技术。 FX-Water simple.shader中即用到了。模拟波浪效果。

Rim lighting: 边缘光照; 在对象的边缘部分添加�亮度。

Base Texture, 基础纹理。

Detail Texture,细节纹理。与base texture使用同样的uv,可是在material中的Tiling值不同。

Cubemap:立方图

Cubemap reflection,立方图反射。

Lambert: 漫反射的lightmodel

cg函数:数学、几何、纹理映射、偏导、调试几大类。

from   wenku.baidu.com/link?url=5lj1AuzFz6YEZDt72eHEIooI42GhwA_hL0_YO6N827tmzqYV85kNqL7WXmvZZ5JJv7GZiYXaIZKAKSY2Rnaf8IdpL2HiwzsiCydgdOcUfWu

tex2D:  Tex2D(sampler2D tex, float2 s),二维纹理查询。 返回四元向量值。  纹理映射函数都返回四元向量值。

mul: 矩阵乘法

UnpackNormal: U3D的标准法线解压函数; 在UnityCG.cginc中。

 unity3d 定制的表面着色器(Surface Shader)的标准输出结构是这种:

struct SurfaceOutput 

{ 

half3 Albedo; //反射率 

half3 Normal; //法线 

half3 Emission; //自发光,用于增强物体自身的亮度,使之看起来好像能够自己发光 

half Specular; //镜面 

half Gloss; //光泽 

half Alpha; //透明 

};

#pragma surfacesurfaceFunction lightModel [optionalparams]

surfaceFunction -表示Cg函数中有表面着色器(surface shader)代码。这个函数的格式应该是这样:void surf (InputIN,inout SurfaceOutput o),Input是你自定义的结构。Input结构中应该包括全部纹理坐标(texturecoordinates)和和表面函数(surfaceFunction)所须要的额外的必需变量。

lightModel-在光照模式中使用。内置的是Lambert (diffuse)和 BlinnPhong(specular)。

//vertex shader的输入

struct appdata_base { float4 vertex : POSITION; //顶点位置 float3 normal : NORMAL; //法线方向 float4 texcoord : TEXCOORD0;//纹理坐标。。?};


// scroll bump waves
	float4 temp;//四元向量xyzw
        v.vertex.xzxz表示去除vertex的x z x z四个分量组成一个新的向量; 计算后给temp赋值。
        temp.xyzw = v.vertex.xzxz * _WaveScale / unity_Scale.w + _WaveOffset;
	o.bumpuv[0] = temp.xy * float2(.4, .45);
	o.bumpuv[1] = temp.wz;

from

http://hi.baidu.com/stupidboys1027/item/e6ac3cbb4faccbd684dd799a

语意输入,语意输出, uniform

依据语意将參数与顶点的信息绑定。

非常明显地看到,入口变量中有三种不同类型的參数:语义型输入參数,语义型输出參数,uniform输入參数。
    首先我们来理解“语义”,这个词的真正含义,事实上,更准确地说我们应该把它叫“绑定语义”(Binding Semantics),从Binding这个词我们就能想像得到,POSITION这个语义,它就是用来把pInitial 这个參数与外部环境(OpenGL)中的顶点位置向量绑在一起。输出语义也是这种原理。

让我们来回答開始时提出的问题:从哪里来,到哪里处。

1、从哪里来。
如今让我们假设,OpenGL在对顶点进行渲染之前,在程序中都自己主动生成了这样一个数据结构struct vertex; 这个数据结构包括了vertex.position, vertex.normal, vertex.color, vertex.texcoord.等等全部与顶点相关的状态信息。而这些信息都是公开的,可以被外部函数所引用。所以,CG中的语义型输入參数的值就是从这些信息中自己主动获取。如样例中的“float4 pInitial : POSITION”,通过POSITION这个绑定语义,把pInitial这个变量与vertex.position这个信息绑定在一起,于是pInitial就被赋值了。这是不是和C++中的引用一样的原理呢?
注意:输入參数是仅仅读的。
2、到哪里去?
假设知道了从哪里来,那么到哪里去也非常好理解,(out float3 color : COLOR),有个OUT在前面作修饰的參数就是语义型输出參数。这里通过COLOR这个绑定语义,把color向量与vertex.color这个值绑定在一起。在CG的代码中,经过一系列的运算和处理之后,终于得到顶点的新的颜色,把这个颜色值又一次返回给OpenGL的顶点属性中,OpenGL再通过读取该属性对顶点进行渲染。

总的来说,语义型參数的输入与输出都是由CG自己主动完毕,程序要做的仅仅是把它与相应的语义绑定。

    说了那么多,另一个uniform输入參数,我们还没有说。假设说语义型參数是CG自己主动处理的,那么uniform型參数就是要程序猿在程序中为它赋值的。

http://blog.sina.com.cn/s/blog_63507a56010115gr.html

from cg users manual

float2 * float2; 相应分量相乘后得到的向量。 不是叉乘。

dot, 点乘, 得到的是标量。 相应分量相乘后的和值。

标量与向量相乘, 是将向量的每一个分量乘以标量后得到的新向量。 (向量放缩了。)

mul, 矩阵乘法; 矩阵乘以向量、 或者矩阵相乘。

Swizzle operator:

——-float3(a,b,c).zyx yields float3(c, b, a)

——-float4(a,bc,d).xxyy yields float4(a,a,b,b)

Texture Lookups 须要两个參数: Texture sampler, texture coordinate

——–texture sampler:   sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, sampleRECT.

——–tex2D/RECT/CUBE, nonprojective

——–text2D/RECT/CUBEproj, projective texture lookup

float, 32bit浮点数, s23e8 + 1bit

halft, 16bit,                s10e5

int, 32 bit integer

fixed, 12bit

bool,

sampler*, texture object的HANDLE。

string

向量、矩阵。

mul(MVP, pos)—->将vertex的postion转化为屏幕上的坐标

tex2D(texture, texcoordinate)———>Output the color taken from our texture

vertex的输出 是 fragment的输入

屏幕绘制过程:
1) 屏幕绘制到temporary texture中; 而不是通常的screen buffer
2) temporary texture 会经过filter的处理。
3) 处理结果放到screen buffer中准备绘制到屏幕上显示给用户

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119207.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hackbar常用误区

    hackbar常用误区在web题目中,hackbar使用可以说是非常频繁,但不同hackbar使用上有略微区别.推荐使用googlechrome下的hackbar如果是firefox的话,hackbar有略微缺陷post的数据必须是键值对,不可以直接post数据比如说我想要利用inlcude($_GET)洞利用php://input的时候想要postphpinfo();结果点execute没有反应而googlechrome下的没有问题下面是安装这种非键值对也可以成功…

    2022年5月28日
    88
  • 张孝祥Java培训视频及孙鑫java视频网址[通俗易懂]

    张孝祥Java培训视频及孙鑫java视频网址[通俗易懂]博主强烈推荐,张老师的JAVA教程帮了我好多,说实话看这个视频比大学老师上课好百倍,张老师的边讲边操作,运动风趣生动的例子的讲课方法对学习JAVA学习者的帮助很大很大…[张孝祥Java培训][基础篇][url]http://www.ancn.cn/zl/java/lesson01.rmvb[/url][url]http://www.ancn.cn/zl/java/les…

    2022年5月17日
    45
  • 获取股票历史数据和当前数据的API

    获取股票历史数据和当前数据的API关键字:股票,stock,API,接口1.获取股票当前数据新浪数据接口:http://hq.sinajs.cn/list={code}。{code}替换为股票代码,沪市股票代码加前缀sh,深市股票代码加前缀sz。例如:在浏览器地址栏输入:http://hq.sinajs.cn/list=sh601766,sz000002,得到如下结果:varhq_str_sh601766=”中国中车,10.280,10.210,10.310,10.380,10.160,10.300,10.310,.

    2022年6月24日
    45
  • 如果我说熟悉SpringBoot 面试官会怎么问?

    如果我说熟悉SpringBoot 面试官会怎么问?SpringBoot因简化了Spring框架使用难度,极大地提高了Java企业级应用开发的效率,成为企业考核人才的重要标准之一。但随着现今互联网行业快速发展、企业业务不断深入,相应地对SpringBoot技术要求也愈来愈高。春节时期有一位打算金三银四面试的读者私信问我:如果我说熟悉SpringBoot面试官会怎么问?​可能不少朋友跟他一样,不清楚当下企业真实生产环境下对SpringBoot有哪些具体要求,需要掌握到什么程度。为此,结合这些年的面试经历及各大厂的职位要求,给

    2022年6月5日
    28
  • 用心做软件—细节决定成败「建议收藏」

    用心做软件—细节决定成败「建议收藏」软件是什么?也许在编程者的眼中这是自己智慧的结晶,是技术运用的成果。但是在用户的眼中呢,用户会在乎你到底用了多少高级的技术、用了什么前卫的技术吗?我想大部分用户是不会管的,无论你是C#做的,Java做的,C++还是C做的,你的系统是Windows还是Linux,android还是塞班。用户的眼中你的软件只是一件产品,那么既然是产品,就要有价值,要能为用户带来方便,能为用户解决问题。当今的互联网上,

    2022年9月23日
    2
  • html简单网页代码 案例_制作网页代码案例

    html简单网页代码 案例_制作网页代码案例当初面试官让我现场手写内存溢出案例代码,我就以Java代码的方式列举了几个典型的内存溢出案例。今天分享给大家,希望大家在日常工作中,尽量避免写这些low水平的代码

    2022年8月22日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号