如何在像素着色器中使用顶点数据



三角形有3个顶点。像素着色器从顶点着色器接收数据。如果每个顶点都有不同的颜色,则会计算颜色之间的过渡。

这种转换的计算,是否对像素着色器从顶点着色器接收的所有数据都这样做?

例如,取一个带纹理的三角形和一个点光源。点光源到每个顶点的距离在顶点着色器中计算。这将传递给像素着色器。在pixelshader中,它从纹理中获取颜色并进行一些灯光计算。它为一个像素做了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工具包着色器中抄袭的。

最新更新