gpt4 book ai didi

opengl - 在 GLSL 中混合多个纹理

转载 作者:行者123 更新时间:2023-12-04 15:36:47 26 4
gpt4 key购买 nike

这很长,但我保证它很有趣。 :)

我正在尝试使用 jMonkeyEngine 模仿另一个应用程序纹理的外观。我有一个顶点列表,以及组成“景观网格”的面(三角形),应该使用大约 7-15 种不同的纹理(取决于“景观”的地形)进行纹理化。每个三角形都有一个与之相关的纹理代码,表示特定三角形应该主要由哪个纹理组成。当然,纹理应该在每张脸之间平滑融合。

所以我正在尝试开发一种允许这样做的策略(它不使用预制的 alpha 贴图 png 文件,纹理 alpha 需要在运行时完成)。现在我想如果我计算每个顶点的每个纹理的“强度”(在顶点着色器中)——通过考虑所有相邻面的地形类型(不确定如何做到这一点)——我应该能够根据像素距顶点的距离设置 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 上完成的,我想。欢迎任何建议。

最佳答案

如果我理解正确的话,这就是我的第一个镜头:

您的问题或多或少是如何在顶点上分配您的每面值。这实际上类似于网格上的法线生成:首先您将为每个三角形生成一个法线,然后按顶点计算它们。谷歌“正常一代”,你会到达那里,但这里是要点。对于每个相邻的三角形,找到一个加权因子(通常是使用顶点的角的角度,或三角形的表面积,或组合),然后将值相加(无论是法线还是您的“强度”)乘以通过权重因子得到总结果。正常化,你就完成了。

那么你就有了可以发送到顶点着色器的纹理“强度”。现代的解决方案是使用字符并在像素着色器中对纹理数组进行采样,在您稍微调整混合值以提供更好的传输之后。

所以,如果我正确理解你的问题:

预处理:

forearch vertex in mesh
vertexvalue = 0
normalization = 0
foreach adjacent triangle of vertex
angle = calculateAngleBetween3Vertices(vertex,triangle.someothervertex,triangle.theotherothervertex)
vertexvalue += triangle.value * angle
normalization += angle
vertexvalue/=normalization

渲染时间:

将每个顶点的值通过管道传送到片段着色器,并在片段着色器中执行此操作:
basecolour = 0;
foreach value
basecolour = mix(basecolour, texture2D(textureSamplerForThisValue,uv), value)
//this is simple, but we could do better once we have this working

或者,您也可以仔细查看您的几何图形。如果您有大三角形和小三角形的组合,您将拥有不均等的数据分布,并且由于您的数据是每个顶点,您将在更多几何形状的地方获得更多细节。在这种情况下,您可能想要做其他人正在做的事情,并通过使用混合贴图将纹理与几何分离。这些可能是低分辨率的,不应过多地增加您的内存消耗或着色器执行时间。

关于opengl - 在 GLSL 中混合多个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6564651/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com