HLSL顶点着色器

时间:2014-01-30 13:14:28

标签: xna shader hlsl vertex-shader

我一直在研究HLSL中用于XNA项目的着色器(所以没有DX10-DX11),但我发现的几乎所有资源都是效果教程,其中大部分工作都是在像素着色器中完成的。对于灯光中的istance,顶点着色器仅用于像素的一个法线和其他类似物。 我想根据顶点着色器而不是像素一样来制作一些效果,就像变形一样。有人可以建议我一本书或一个网站吗?即使是裸露的效果名称也是有用的,因为我可以谷歌它。

1 个答案:

答案 0 :(得分:0)

在像素着色器中完成了大量的光照等,因为最终的图像质量会更好。

想象一下通过细分立方体或二十面体来创建的球体。如果在顶点着色器中完成光照计算,则会在面边缘之间插入结果值,这可能会导致平面或多面外观。

混合和变形之类的东西都是在顶点着色器中完成的,因为这是你可以操纵顶点的地方。

例如:

matrix World;
matrix View;
matrix Projection;
float WindStrength;
float3 WindDirection;


VertexPositionColor VS(VertexPositionColor input)
{
    VertexPositionColor output;

    matrix wvp = mul(mul(World,View),Projection);
    float3 worldPosition = mul(World,input.Position);

    worldPosition += WindDirection * WindStrength * worldPosition.y;

    output.Position = mul(mul(View,Projection),worldPositioninput); 
    output.Color = input.Color;

    return output;
}

(因为我在SO帖子编辑器中写这篇文章,所以是伪代码。)

在这种情况下,我用风向和强度偏移Y轴上“高”的顶点。例如,如果我在渲染草地时使用它,那么叶片的顶部会向风的方向倾斜,而靠近地面的顶点(理想情况下,Y为零)将根本不会移动。这里的数学应该稍微调整一下,以考虑会导致不可接受的大变化的高大事物,并且风不应该均匀地应用于所有叶片,但应该清楚的是,这里顶点着色器正在修改网格。非均匀的方式来获得有趣的效果。

无论你想要达到什么效果 - 变形,广告牌(所以你绘制的项目总是面向相机)等,你最终会将一些参数传递给VS,然后选择性地在顶点穿过管道时应用于顶点。

一个相当简单的例子就是根据一些参数将模型“膨胀”为一个球体。

再次伪代码,

matrix World;
matrix View;
matrix Projection;
float LerpFactor;

VertexShader(VertexPositionColor input)

float3 normal = normalize(input.Position);
float3 position = lerp(input.Position,normal,LerpFactor);

matrix wvp = mul(mul(World,View),Projection);

float3 outputVector = mul(wvp,position);
....

通过在多个帧中将均匀LerpFactor从0步进到1,您的网格(理想情况下为凸多面体)将逐渐从其原始形状变为球形。当然,您可以在顶点声明中包含更明确的变形目标,并在两个模型形状之间进行变形,将其折叠为模型的不太复杂的版本,打开盒子上的盖子(或完全展开它)等。可能性是无止境的。

有关详细信息,this page提供了一些关于在GPU上生成和使用变形目标的示例代码。

如果您需要一些好的搜索字词,请查找“xna骨骼”,“混合重量”和“变形目标”。