我正在处理从服务器检索到的高度纹理。它编码RGB
通道中每个像素的总体高度值。要获得每个像素的高度值,R
通道乘以65536.0,G
乘以256.0,然后乘以height = R + G + B
。
由于这种分裂,R
和G
有不连续(见下面的G
通道的图像与100%的白色和100%的黑色区域),因为他们需要另一部分(R或B)接管。这就是为什么我不能线性过滤纹理。然而,我想线性过滤B
通道,因为它包含最高的频率/最小的高度偏差- in,以便得到一个光滑的表面。
是否有可能在内部分割纹理(例如,在着色器内部,但我不介意这种情况发生在哪里),以便只对其B
通道进行线性过滤,而R, B
通道则留在最近的邻居处?在所有组件再次相加之前?若然,如何有效地做到这一点?
发布于 2020-07-29 18:22:14
WebGL纹理过滤适用于整个纹理,而不是每个单独的通道。但你可以做的是克隆纹理,并分别在着色器中对它们进行采样。
var texture2 = texture1.clone();
texture1.magFilter = THREE.NearestFilter;
texture2.magFilter = THREE.LinearFilter; // This is the default
然后在你的阴影里:
vec2 sampleRG = texture2D(texture1, vUv).rg;
float sampleB = texture2D(texture2, vUv).b;
这是一些额外的开销,但没有什么是您的GPU无法处理的。
注意,我总是看到每个通道的值范围从0到255,而不是256。你确定你不想乘255吗?
https://stackoverflow.com/questions/63157510
复制相似问题