【发布时间】:2011-07-03 18:13:06
【问题描述】:
这很长,但我保证它很有趣。 :)
我正在尝试使用 jMonkeyEngine 来模仿另一个应用程序纹理的外观。我有一个构成“景观网格”的顶点和面(三角形)列表,应该用大约 7-15 种不同的纹理(取决于“景观”的地形)进行纹理化。每个三角形都有一个与之关联的纹理代码,表示该特定三角形应该主要由哪个纹理组成。当然,纹理应该在每个面之间平滑融合。
所以我正在尝试制定一种策略来实现这一点(它不使用预制的 alpha 贴图 png 文件,纹理 alpha 需要在运行时完成)。现在我想如果我计算每个顶点的每个纹理的“强度”(在顶点着色器中) - 通过考虑所有相邻面的地形类型(不确定如何做到这一点) - 我应该能够根据像素与顶点的距离来设置 alpha 值。碎片着色器将使用生成的“阿尔法贴图”来混合每个像素的每个纹理。
这是否可行,还是我应该考虑完全不同的策略?我有我试图模仿的应用程序的着色器代码(但它们是 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 上完成的,我想。欢迎提出任何建议。
【问题讨论】:
标签: opengl 3d glsl shader hlsl