一个三角形有3个顶点。像素着色器从顶点着色器接收数据。如果每个顶点具有不同的颜色,则将计算这些颜色之间的过渡。
此过渡的计算,是否对像素着色器从顶点着色器接收的所有数据执行此操作?
例如,使用一个带纹理的三角形和一个点光源。在顶点着色器中计算从点光源到每个顶点的距离。这将传递到像素着色器。在像素着色器中,它从纹理中获取颜色并进行一些光照计算。它对一个像素执行3次,然后取平均颜色?
谢谢,
普通的每像素照明效果是通过将世界位置传递到像素着色器来完成的。这是一个示例管道:
struct VSInput
{
float4 Position : SV_Position;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
struct VSOutput
{
float2 TexCoord : TEXCOORD0;
float4 PositionWS : TEXCOORD1;
float3 NormalWS : TEXCOORD2;
float4 Diffuse : COLOR0;
float4 PositionPS : SV_Position;
};
// Vertex shader
VSOutput VertexShader(VSInput vin)
{
VSOutput vout;
vout.TexCoord = vin.TexCoord;
vout.PositionPS = mul(position, WorldViewProj);
vout.PositionWS = mul(position, World).xyz;
vout.NormalWS = normalize(mul(normal, WorldInverseTranspose));
vout.Diffuse = float4(1, 1, 1, DiffuseColor.a);
return vout;
}
struct PSInput
{
float2 TexCoord : TEXCOORD0;
float4 PositionWS : TEXCOORD1;
float3 NormalWS : TEXCOORD2;
float4 Diffuse : COLOR0;
};
float4 PixelShader(PSInput pin) : SV_Target0
{
float4 color = Texture.Sample(Sampler, pin.TexCoord) * pin.Diffuse;
float3 eyeVector = normalize(EyePosition - pin.PositionWS.xyz);
float3 worldNormal = normalize(pin.NormalWS);
ColorPair lightResult = ComputeLights(eyeVector, worldNormal, 3);
color.rgb *= lightResult.Diffuse;
AddSpecular(color, lightResult.Specular);
ApplyFog(color, pin.PositionWS.w);
return color;
}
这是从DirectX Tool Kit着色器抄写而成的。