Shader技术属于GPU的渲染技术,其相应语言是高级着色器语言(High Level Shader Language 简称HLSL)。HLSL主要作用为将一些复杂的图像处理快速而又有效率地在显卡上完成。
在DirectX中有两种Shader,顶点着色器Vertex Shader (vs)和像素着色器Pixel Shader (ps)。能够实现VS和PS的显卡的图形处理流水线被称作为是可编程的。VS实际代替了传统图形渲染流水线里的T&L部分,其以顶点为计算单位,负责处理世界坐标中的顶点信息,可以处理光照、阴影、坐标变换、法向量等等。PS代替了传统图形渲染流水线中的光栅化部分,比如纹理贴图等, 其以像素为计算单位,用来操纵物体表面的色彩和外观。
1.Shader基本框架
Shader文件的后缀名为.fx,可在文件里编写如下代码:
首先定义一颜色纹理变量:texture ColorMap,这是Shader与C++的接口.
定义一采样变量,例:
sampler ColorSampler = sampler_state
{
texture = (ColorMap);
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
设计一顶点格式,例:
struct VSOutShadow
{
float4 vPosition : POSITION;
float2 vTexcoord : TEXCOORD0;
float diff : TEXCOORD1;
};
定义全局变量:
shared uniform float4x4 World: World //世界变换矩阵
shared uniform float4x4 View: View; //观察矩阵
shared uniform float4x4 Projection : PROJECTION; //投影矩阵
顶点着色函数,例:
VSOutShadow VS_Scene( float4 inPosition : POSITION, float2 texcoord:TEXCOORD0)
{
VSOutShadow OUT = (VSOutShadow)0;
//使用传入的参数计算顶点的相关信息
inPosition = mul( inPosition, World );//世界变换
OUT.vPosition = mul( inPosition, View );//摄像机变换
OUT.vPosition = mul( OUT.vPosition, Projection );//投影变换
。。。。。。。。。。
。。。。。。。。。。
return OUT;
}
像素着色函数,例:
float4 PS_Scene( VSOutShadow IN) : COLOR0
{
float4 color= tex2D(ColorSampler,IN.vTexcoord);
//使用传入的参数设置像素的着色
return color;
}
定义技术:
technique techScene
{
pass p0
{
VertexShader = compile vs_2_0 VS_Scene();//对应顶点着色函数
PixelShader = compile ps_2_0 PS_Scene();//对应像素着色函数
}
}
2.在C++应用shader
先设计一EffectManager类,并提供一接口,用于根据传入的.fx 文件的路径名创建一ID3DXEffect类型的指针m_pShader并使其指向该文件,函数返回m_pShader,可用m_pShader调用相应函数设置shader里的变量值,例如:
m_pShader->SetFloat("ambient",m_sight);
m_pShader->SetMatrix("World",&finalWorldMat);
其中ambient,World为shader里的变量,m_sight,finalWorldMat为c++程序里的变量,设置特定类型的变量需调用相应的函数。
设置技术:m_pShader->SetTechnique("techScene")
techScene为shader里已定义的技术。
着色,例:
UINT passnum=0;
m_pShader->Begin(&passnum,0);
for(UINT pass=0;pass<passnum;pass++)
{
m_pShader->BeginPass(pass);
_Render();//完成相关操作
m_pShader->EndPass();
}
m_pShader->End();
_Render()里需设置纹理,例:m_pShader->SetTexture("ColorMap",m_pMeshTextures[i]);
提交: m_pShader->CommitChanges();
分享到:
相关推荐
云层shader,
在学习了一点儿shader和图形卡发展的历史之后,你将经历创建一个简单shader的过程,只要渲染一个带有每像素镜面反射光的简单3D模型,然后把shader导入到你的游戏引擎。你将用来创建shader、甚至在你开始把更多代码...
Unity2020.3版本水面倒影Shader案例 文章地址:https://zhima.blog.csdn.net/
Unity Shader 之遮挡透明
Shader变体收集 Shader Control 6.4
Unity3D使用的皮肤Shader资源,可在Unity3D中渲染出真实的毛发效果。
免费下载地址:https://blog.csdn.net/linda012518/article/details/106048377 unity 调色板之shader绘制,最近闲来无事,给自己找点麻烦,用shader做一个调色板,分享给大家
全息效果是通过贴图的Offset随时间滚动产生,ShaderGraph实战之全息效果
u3d场景中用于实现水流动的效果的shader
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的...
Unity3D Shader 是 Unity3D 游戏引擎中最重要的一部分,它控制着游戏中的所有渲染工作。如果您想深入了解 Unity3D 的核心技术,学习 Shader 编程是必经之路。然而,对于初学者来说,Shader 的学习曲线非常陡峭,...
Shader Forge v1.3.5 for Unity5.5.unitypackage Shader Forge v1.3.6 for Unity5.5.unitypackage Shader Forge v1.3.7 for Unity5.6.unitypackage Shader Forge v1.3.8 for Unity4.5-5.6.unitypackage Shader Forge...
溶解效果是游戏中常用的一种效果,可用于Boss死亡时的消失。溶解效果的原理是通过一张噪波贴图,实现模型上随机消失。
传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码) 然后我们来看下Unity3D自带的60多个Shader。 这些Shader被分为五个...
淘宝花RMB买的·····Refractive Shader 1.2 最新版本,请勿用于商业用途,仅供学习参考! https://assetstore.unity.com/packages/vfx/shaders/substances/refractive-shader-94848 his shader emulates light...
模拟电流效果(shader),将此shader导入Unity引擎中可直接使用
Shader动画,有时候比Transform的动画更加高效。 可以创建多个管线的Shader资源,方便切换或者升级管线。 节点式的编辑器,类似UE的蓝图编辑器,可视化编程比较直观,暴露参数简单。 有一句话叫做:黑透白不透。 ...
自定义ShaderGraph
unity shader 可视化插件 比shader graph 好多了
我们这里学习的是Unity的Compute Shader,作为一种Shader语言,它的语法结构和普通Shader差不多,float3,float4x4等数据结构和数学函数都可以支持,并且还可以把计算的结果作为结构体数组的方式类型输出出来。...