首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将纹理- apply线性滤波的R、G和B通道拆分为Three.js/WebGL/Shaders中的一个子集

将纹理- apply线性滤波的R、G和B通道拆分为Three.js/WebGL/Shaders中的一个子集
EN

Stack Overflow用户
提问于 2020-07-29 15:51:29
回答 1查看 203关注 0票数 0

我正在处理从服务器检索到的高度纹理。它编码RGB通道中每个像素的总体高度值。要获得每个像素的高度值,R通道乘以65536.0,G乘以256.0,然后乘以height = R + G + B

由于这种分裂,RG有不连续(见下面的G通道的图像与100%的白色和100%的黑色区域),因为他们需要另一部分(R或B)接管。这就是为什么我不能线性过滤纹理。然而,我想线性过滤B通道,因为它包含最高的频率/最小的高度偏差- in,以便得到一个光滑的表面。

是否有可能在内部分割纹理(例如,在着色器内部,但我不介意这种情况发生在哪里),以便只对其B通道进行线性过滤,而R, B通道则留在最近的邻居处?在所有组件再次相加之前?若然,如何有效地做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-29 18:22:14

WebGL纹理过滤适用于整个纹理,而不是每个单独的通道。但你可以做的是克隆纹理,并分别在着色器中对它们进行采样。

代码语言:javascript
运行
复制
var texture2 = texture1.clone();
texture1.magFilter = THREE.NearestFilter;
texture2.magFilter = THREE.LinearFilter; // This is the default

然后在你的阴影里:

代码语言:javascript
运行
复制
vec2 sampleRG = texture2D(texture1, vUv).rg;
float sampleB = texture2D(texture2, vUv).b;

这是一些额外的开销,但没有什么是您的GPU无法处理的。

注意,我总是看到每个通道的值范围从0到255,而不是256。你确定你不想乘255吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63157510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档