HLSL初学者需要一些指导

时间:2012-05-15 12:49:25

标签: direct3d hlsl

是否有任何HLSL编写的.fx文件示例,该文件使用不同的图块拼接平铺纹理?像这样:http://messy-mind.net/blog/wp-content/uploads/2007/10/transitions.jpg你可以看到每个正方形中有不同的图块类型,并且之间有一点模糊它们可以实现更平滑的过渡,但是现在我只需要找到一种在纹理上绘制图块的方法。我有一个整数的2D数组,每个整数等于相应的图块类型(0 =草,1 =石头,2我打开了一些HLSL示例,他们真的很混乱。在C ++方面一切运行正常,但HLSL证明是困难的。

2 个答案:

答案 0 :(得分:2)

您可以使用一种称为“纹理喷溅”的技术。它使用另一个纹理混合多个纹理(颜色贴图),其中包含每个颜色贴图的Alpha值。具有alpha值的纹理与2D数组相当。您可以创建一个3通道RGB纹理,并将每个通道用于不同的颜色贴图(在您的情况下:R - 草,G - 石头,B - 沙)。这个纹理的每个像素告诉我们如何混合颜色图(例如R = 0表示'没有草',G = 1表示'全石',B = 0.5表示'沙子,半强度')。

假设您有四种RGB纹理:tex1 - 草,tex2 - 石头,tex3 - 沙子,alpha - 混合纹理。在.fx文件中,创建一个简单的顶点着色器,它只计算位置并传递纹理坐标。整个过程在像素着色器中完成,它应该如下所示:

float tiling_factor = 10; // number of texture's repetitions, you can also
                          // specify a seperate factor for each texture

float4 PS_TexSplatting(float2 tex_coord : TEXCOORD0)
{
    float3 color = float3(0, 0, 0);
    float3 mix = tex2D(alpha_sampler, tex_coord).rgb;
    color += tex2D(tex1_sampler, tex_coord * tiling_factor).rgb * mix.r;
    color += tex2D(tex2_sampler, tex_coord * tiling_factor).rgb * mix.g;
    color += tex2D(tex3_sampler, tex_coord * tiling_factor).rgb * mix.b;
    return float4(color, 1);
}

答案 1 :(得分:1)

如果您的应用程序支持多次渲染,则应使用它。

您应该使用多次通过着色器方法,在第一次通过中使用平铺的石头纹理渲染基础对象,并在顶部使用不同的着色器和不同的细节纹理渲染贴图,并使用单独的透明Alpha贴图。
(透明贴图也可以存储在您的细节纹理中,但保持其分离允许不同的贴图级别,并且可以更灵活地重复使用它。)

此外,您可以为每个贴花通道使用不同的纹理坐标通道,这样您就不需要对平铺级别进行硬编码。

所以至少你需要两个着色器,而Shader 2经常被用作你需要的贴花。

  1. 着色器渲染平铺的基础纹理
  2. 着色器使用单独的透明度贴图渲染一个平铺的细节纹理。
  3. 如果你有多个贴花可能会发生z-fighting,你应该稍微偏移你的多边形。 (非常类似于基本的简单毛发渲染。)

    另外,你需要一个单独的着色器,它采用多个纹理并将它们放置在基础平铺纹理的顶部,这个解决方案不太灵活,但你可以使用一个纹理来混合纹理(等于你的2D数组)。