gpt4 book ai didi

glsl - 着色器中的平铺纹理

转载 作者:行者123 更新时间:2023-12-04 18:50:49 26 4
gpt4 key购买 nike

我传递给顶点着色器 (glsl) 2 个纹理:来自屏幕和较小的法线贴图。
法线贴图根据屏幕尺寸进行缩放。所以如果第一个纹理是 1152×864像素和法线贴图是 256×256 ,它将从它的大小缩放到更大。

我怎样才能让它平铺?例如。使其大小为 256×256并通过所有纹理平铺。

UPD :

例如,我的主要(大)纹理映射如下:

[0.17, 0.61, 0.33, 0.83]

代替:
[0, 0, 1, 1]

这样我的正常纹理也被映射到第一个坐标。所以我看到了它的一个小的映射矩形。如何在着色器中将其映射为完整尺寸?

最佳答案

it will be scaled from it's size to bigger.



不,它肯定不会。这是对纹理的常见误解。纹理只不过是花哨的查找表。纹理不会相对于彼此“缩放”;这只是你使用什么纹理坐标的问题。

很可能,您正在做的是对屏幕纹理使用与法线贴图相同的纹理坐标。由于我们可能在谈论标准化纹理坐标,这意味着您将相同的 [0, 1] 范围映射到它们两个。

为了获得您正在谈论的效果,您需要为正常纹理计算纹理坐标,以执行您需要它们执行的操作。所以如果你有一个相对于屏幕纹理的纹理坐标,你必须把它转换成你想要的空间作为普通纹理。

有几种方法可以做到这一点。手动方法是在 CPU 上计算纹理大小与彼此的比率,然后将其传递给着色器。使用您提供的数字,大小比率将是:
(1152.0/256.0, 864.0/256.0) = (4.5, 3.375).

确保这是在浮点数学中完成的。完成后,简单地将它传递给一个统一的,并在采样前在着色器中将纹理坐标乘以这个比率:
uniform vec2 textureRatio;

void main() {
//Get the texture coordinate.
vec4 screenTexColor = texture(screenTex, texCoord);
vec2 normTexCoord = textureRatio * texCoord;
vec4 normalValue = texture(normalTex, normTexCoord);
//Do something with these.
}

GLSL 中的自动方式是直接在着色器中执行此操作。这需要 GLSL 1.30 或更高版本。基本上,您可以使用该语言的可用功能来计算比率:
void main() {
//Get the texture coordinate.
vec2 textureRatio = textureSize(screenTex) / textureSize(normalTex);
vec4 screenTexColor = texture(screenTex, texCoord);
vec2 normTexCoord = textureRatio * texCoord;
vec4 normalValue = texture(normalTex, normTexCoord);
//Do something with these.
}

在这两种情况下,我假设您的 GL_TEXTURE_WRAP_S/T 设置为 GL_REPEAT 并带有适当的纹理或采样器参数。

请注意,在 CPU 上计算比率并将其作为统一传递可能比在着色器中计算要快。特别是对于片段着色器,它将运行非常多。

关于glsl - 着色器中的平铺纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6473321/

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