|
|
vertex shader 和 pixel shader之间的光栅化和插值的原理是什么?
如per-pixel lighting shader:
struct VS_INPUT
{
float3 pos : POSITION;
float3 normal : NORMAL;
};
struct VS_OUTPUT
{
float4 pos : POSITION;
float3 worldPos : TEXCOORD0;
float3 normal : TEXCOORD1;
};
VS_OUTPUT my_vs(VS_INPUT vert)
{
VS_OUTPUT vsout;
vsout.pos = mul(float4(vert.pos,1),matWorldViewPrj);
vsout.worldPos = mul(float4(vert.pos,1),matWorld);
vsout.normal = normalize(mul(vert.normal, matWorld));
return vsout;
}
//--
float4 my_ps(float3 worldPos : TEXCOORD0,
float3 normal : TEXCOORD1) : COLOR
{
float4 color;
//-- ambient
color = mtlDiffuseColor*0.2f;
//-- diffuse
normal = normalize(normal);
float3 L = lightPos - worldPos;
float d = length(L);
L /= d; // normalize L
float atten = 1/(lightAttenuation*d);
float diff = saturate(dot(normal, L));
color += mtlDiffuseColor * diff * atten;
//-- specular
float3 V = normalize(worldPos - eyePos);
float3 R = reflect(L,normal);
float specular = pow(saturate(dot(R,V)),8)*diff*atten;
color += float4(specular,specular,specular,0);
return color;
}
vertex shader里经常将一些顶点的附加信息用纹理坐标输出,如顶点在世界空间的坐标、顶点到灯光向量、顶点的深度值等等,
这些值是如何被光栅化和插值的呢?
谢谢! |
|