这是一个长篇但有趣的内容。:)
我正在尝试使用jMonkeyEngine来模拟另一个应用程序的纹理外观。我有一组顶点和面(三角形),构成了一个“景观网格”,应该用大约7-15种不同的纹理(取决于“景观”的地形)进行纹理贴图。每个三角形都有一个与之关联的纹理代码,表示该特定三角形应主要由哪个纹理组成。当然,纹理之间应该平滑混合。
因此,我正在尝试开发一种策略,允许这样做(不使用预先制作的alpha map png文件,纹理alphas需要在运行时完成)。现在,我认为如果我在每个顶点处计算每个纹理的“强度”(在顶点着色器中)-通过考虑所有相邻面的地形类型(尚不确定如何实现此目标)-我应该能够根据像素距离顶点的远近设置alpha值。生成的'alpha map'将由frag shader用于每个像素的纹理混合。
这种方法可行吗?还是我应该寻找完全不同的策略?我有要模仿的应用程序的着色器代码(但它们是HLSL,而我正在使用GLSL),但似乎它们在其他地方执行这个混合步骤:
sampler MeshTextureSampler = sampler_state { Texture = diffuse_texture; AddressU = WRAP; AddressV = WRAP; MinFilter = LINEAR; MagFilter = LINEAR; };
我不确定什么是HLSL的"MeshTextureSampler",但是这个应用似乎预先混合了所有所需的纹理,并根据面/地形代码数据为整个网格创建了一个单一的纹理。在像素/片段着色器中,他们真正做的只是这样:
float4 tex_col = tex2D(MeshTextureSampler, In.Tex0);
之后只是阴影、灯光等方面,没有任何纹理混合的痕迹,据我所知,这种纹理混合工作可能在CPU上提前完成。欢迎任何建议。