0

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

4

2 回答 2

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);
}
于 2012-05-15T16:50:22.293 回答
1

如果您的应用程序支持多通道渲染,您应该使用它。

您应该使用多通道着色器方法,在第一个通道中使用平铺的石头纹理渲染基础对象,然后使用不同的着色器和具有单独透明 Alpha 贴图的不同细节纹理在顶部渲染贴花通道。
(透明贴图也可以存储在您的细节纹理中,但将其分开允许不同的图块级别和重用它的更大灵活性。)

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

因此,您至少需要两个着色器,而着色器 2 的使用频率与您需要的贴花一样多。

  1. 渲染平铺基础纹理的着色器
  2. 使用单独的透明度贴图渲染一个平铺细节纹理的着色器。

如果您有多个贴花,可能会发生 z-fighting,您应该稍微偏移您的多边形。(非常类似于基本的简单毛发渲染。)

否则,您需要一个单一的着色器来获取多个纹理并将它们放置在基础平铺纹理的顶部,这种解决方案不太灵活,但您可以使用一个纹理来混合纹理(等于您的 2D 阵列)。

于 2012-05-15T14:20:52.033 回答