【问题标题】:How is vertex data used in pixel Shader像素着色器中如何使用顶点数据
【发布时间】:2020-04-03 21:53:39
【问题描述】:
一个三角形有 3 个顶点。
像素着色器从顶点着色器接收数据。
如果每个顶点都有不同的颜色,则计算颜色之间的过渡。
这样一个transition的计算,是不是对pixel shader从vertex shader接收到的所有数据都做这个?
例如,采用带纹理的三角形和点光源。
从点光源到每个顶点的距离在顶点着色器中计算。
这被传递给像素着色器。
在像素着色器中,它从纹理中获取颜色并进行一些光照计算。
它对一个像素执行 3 次,然后取平均颜色?
谢谢,
【问题讨论】:
标签:
directx-11
hlsl
vertex-shader
pixel-shader
【解决方案1】:
常见的逐像素光照效果是通过将世界位置传递给像素着色器来完成的。这是一个示例管道:
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 着色器。