shader与cg简介
来源:互联网 发布:软件销售代理商 编辑:程序博客网 时间:2024/05/01 14:58
1.what? shader?
shader的定义,需要从显卡的渲染管线开始说起。
渲染管线是显卡内部处理图形信号相互独立的的并行处理单元。我们把顶点位置、法线、纹理坐标等数据参数提供出来,然后再定义光源,通过渲染管线,就可以得到一幅渲染出来的画面。早期的渲染管线只有固定渲染管线:即在提供给GPU待绘制的模型单元之后,程序的设计者是无法干预渲染过程的。后来,显卡商将可编程特性引入到了渲染管线中————可编程渲染管线。使得开发者可以通过自己编写一段小程序运行于GPU来控制具体的渲染过程。而这编写的程序,就是Shader。
Shader分为两种:
vertex shader————顶点级shader,在此处program可以改变模型整体的画面效果(如顶点位置可以改变形状,顶点法向量可以改变光照效果)。
fragment shader(pixel shader dx)————像素级shader,在此处program会控制对应像素点的颜色。
(from cg tutorial)
注:
1.Vertex Shader/Fragment Shader在运行时,只能对应单一顶点/像素的数据,即被分配到的顶点/像素
2.shader中的随机一般通过设置一张噪音纹理来实现
2.what? cg?
C for graphics,by nvidia公司,一种高级着色语言,both for dx & opengl。
hello vertex shader (from cg tutorial):
struct Output {
float4 position : POSITION;float4 color : COLOR;};Output vert(float2 position : POSITION, uniform float4 constantColor){ Output OUT; OUT.position = float4(position, 0, 1); OUT.color = constantColor; // Some RGBA color return OUT;
}
semantic:标识变量的用途(如一组float4 用于位置而另一组float4同于法向量),而输入和输出的semantic有不同的意义
函数vert会根据semantic: POSITION,在data stream取得顶点对应的position用于vextex shader,而返回的OUT,会在fragment shader时作为输入。
hello fragment shader (from cg tutorial):
struct Frag_Output { float4 color : COLOR;};
Frag_Output frag(float4 color : COLOR){ Frag_Output OUT;
OUT.color = color; return OUT;}
函数frag将会将该像素的颜色设为其对应的顶点的Output中的COLOR。
————一个vertex shader程序,必须返回一个位置信息,可以返回颜色,uv,或其他与顶点相关的信息。而一个fragment shader,必须把所有的信息最终浓缩为一个颜色返回给GPU。(In some advanced profiles, fragment programs can write additional data such as a depth value as well.)
其实shader program并不难理解,剩下的,就要交给数学和想象力了。
- shader与cg简介
- Unity3D中CG/GLSL shader与iPhone shader的区别
- Cg入门9:Vertex Shader - Uniform 与 properties属性
- Shader学习之Cg语言三(Cg表达式与控制语句)
- Shader学习之Cg语言五(Cg函数与标准函数库)
- Cg basic shader
- Cg shader using discard
- Cg shader for skybox
- shader Cg 基本数据类型
- Shader -- Cg Documentation
- CG简介
- CG简介
- unity shader简介与入门
- Cg shader for RGB cube
- Cg shader using additive blending
- Cg shader with single texture
- Cg shader with reflection map
- Cg shader with refraction mapping
- 重复的固定延迟执行 java
- MFC 判断鼠标是否在控件范围内
- 访问者模式(Visitor Pattern)
- Oracle 查看有哪些表被锁住
- xss漏洞和csrf漏洞防御
- shader与cg简介
- String 类型与 char 类型比较
- poj 1275 Cashier Employment(差分约束#6)
- EventAction和subscription的配置过程
- java内存泄露
- 程序员人生规划
- POJ 2983 Is the Information Reliable?(差分约束#7)
- nginx中hash表的设计与实现
- lambda表达式的一个简单示例