📄 texblendvs.txt
字号:
// File: diffuse.txt
// Desc: Vertex shader that does diffuse lighting.
// Global variables we use to hold the view matrix, projection matrix,
// ambient material, diffuse material, and the light vector that
// describes the direction to the light source. These variables are
// initialized from the application.
matrix ViewMatrix;
matrix ViewProjMatrix;
vector AmbientMtrl;
vector DiffuseMtrl;
vector LightDirection;
// 环境光强度,漫射光强度
// 这些变量定义在着色器代码中
vector DiffuseLightIntensity = {0.8f, 0.8f, 0.8f, 1.0f};
vector AmbientLightIntensity = {0.4f, 0.4f, 0.4f, 1.0f};
// Input and Output structures.
struct VS_INPUT
{
vector position : POSITION;
vector normal : NORMAL;
float2 alpha : TEXCOORD0;
float2 tex1 : TEXCOORD1;
float2 tex2 : TEXCOORD2;
float2 tex3 : TEXCOORD3;
};
struct VS_OUTPUT
{
vector position : POSITION;
vector diffuse : COLOR;
float2 oalpha : TEXCOORD0;
float2 otex1 : TEXCOORD1;
float2 otex2 : TEXCOORD2;
float2 otex3 : TEXCOORD3;
};
//Main
VS_OUTPUT Main(VS_INPUT input)
{
// zero out all members of the output instance.
VS_OUTPUT output;//=(VS_OUTPUT)0;
// 变换位置到齐次坐标空间,保存到output.position成员中
output.position=mul(input.position, ViewProjMatrix);
// 变换光和法线到视图空间,设置w分量为0,是因为变换的向量不是点
LightDirection.w=0.0f;
input.normal.w=0.0f;
LightDirection=mul(LightDirection,ViewMatrix);
input.normal=mul(input.normal,ViewMatrix);
// 计算光与法线夹角的余弦
float s=dot(LightDirection,input.normal);
// 回忆一下,如果法线和光的夹角大于90度,则表面接收不到光。
if(s< 0.0f )
s=0.0f;
// 环境光反射是执行一个叉积(环境材质向量与环境光强度向量),
// 漫射光反射是执行一个叉积(漫射材质向量与漫射光强度向量,
// 更进一步讲,我们测量着色器的颜色,基于顶点从光源处接收到多少光
//环境光和漫射光综合起来,决定一个顶点的最终颜色
output.diffuse=(AmbientMtrl*AmbientLightIntensity)+((DiffuseMtrl*DiffuseLightIntensity)*s);
//纹理坐标
output.oalpha=input.alpha;
output.otex1=input.tex1;
output.otex2=input.tex2;
output.otex3=input.tex3;
return output;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -