当前位置: 首页 > 知识库问答 >
问题:

three.js - threejs中,使用GUI控制纹理的颜色空间为什么不能生效?

邓令雪
2023-09-21
//创建纹理加载器let textureLoader = new THREE.TextureLoader()//加载纹理let texture = textureLoader.load('./textures/parvers/worn_patterned_pavers_diff_4k.jpg')// let texture = textureLoader.load('./textures/covers/Sewer-0793.jpg')//设置sRGB纹理的颜色空间texture.colorSpace = THREE.SRGBColorSpacegui.add(texture, 'colorSpace', {  sRGB: THREE.SRGBColorSpace,  Linear: THREE.LinearSRGBColorSpace}).onChange((val) => {  console.log('change',val)  console.log(texture)  console.log(texture.colorSpace)  texture.needsUpdate = true})

输出的内容显示,texture对象的colorSpace已经改变了,但是页面没有重新渲染。

即便在使用后,texture.needsUpdate = true 后,仍然没有效果。

值得注意的是,当我不设置texture的颜色空间,即texture.colorSpace = THREE.LinearSRBColorSpace 或者 THREE.NoColorSpace的时候,可以实现页面从linear-srgb到srgb的转换,但是不能实现srgb到linear-srgb的转换。

这是什么情况导致的?该如何实现GUI控制纹理的颜色空间的转变?

补充1:

根据官方文档,只要改变颜色空间,就需要将材质的needsUpdate设置为true就可以重新编译了,但是,即使我在onchange中的回调函数中加上material.needsUpdate = true也并没有什么改变

共有1个答案

胡嘉歆
2023-09-21
gui.add(params, 'colorSpace', {  sRGB: 'sRGB',  Linear: 'Linear'}).onChange((val) => {  texture.dispose(); // 释放旧纹理  texture = textureLoader.load('./textures/your_texture.jpg', function(t) {    if (val === 'sRGB') {      t.encoding = THREE.sRGBEncoding;    } else {      t.encoding = THREE.LinearEncoding;    }  });  material.map = texture; // 更新材质的纹理  material.needsUpdate = true; // 标记材质需要更新});
 类似资料:
  • 我正在使用 LWJGL(适用于 Java 的开放GL)库进行纹理映射。以下是从文件中读取图像的代码: 以字节数组形式获取数据栅格(图像像素)的代码: 现在,创建“bytePixels”数组并将其放入字节缓冲区的代码: 这里用于将所有这些绑定到缓冲区: 问题是,图像纹理的颜色与原始图像颜色不同! 原始图片: 纹理图像: 这个答案OpenGL渲染纹理与原始图像颜色不同?,不能解决这个问题,因为在lwj

  • 我使用下面的POV-Ray循环在其他颜色空间绘制sRGB坐标。环路只沿着外表面产生点,然后用三角形连接它们。因为sRGB空间是一种扭曲的立方体,这意味着6个外表面和8个顶点。 这很有效,因为几乎所有的颜色空间都是三维的。以下是一个输出示例: 不过,我想对CMYK颜色空间也这么做。我遇到的问题是,它有4个参数,而不是3个。同样,我只想在最外面的曲面上绘制点,并用三角形连接它们。我不认为产生的颜色立体

  • 如何通过编程确定给定像素是否为黄色?还是红色?还是其他颜色? 在RGB空间中,红色通常是(255,0,0),但我们也知道(230,0,0)也会出现红色。 有没有什么标准将RGB空间分成八种主要颜色——红色、绿色、蓝色、黄色、洋红色、青色、黑色和白色?

  • 之前用过了静态的纹理设置材质,这次来尝试一下动态的变换,这次来尝试颜色变换 先创建工程,步骤略 添加一个管线,参考官方示例Polyline Volume,每个示例的代码,都用一下,说不定学到点新东西呢~ (#^.^#) 这里按理说应该是要给纹理赋值了,要它动态变化,一般有两种思路,其一是赋值一次,然后之后用代码(定时器)动态修改材质,其二是使用回调,在上一篇鹰眼图中尝试过,发现回调效果比较好,不会

  • 通过阅读HSL / HSV色彩理论,我得到的印象是色调分量是一个周期性属性,每360度重复一次,可以独立于饱和度和亮度/值而改变。如果我错了,请纠正我,但这些陈述在逻辑上遵循前面的定义: < li >将色调旋转360度会产生相同的颜色 < li >将色调旋转180度两次会产生原始颜色 < li >将色调旋转180度,然后旋转-180度,产生原始颜色 但是,只有选项 1 是正确的。将色调旋转 4 倍

  • 问题内容: 我尝试设置复选框背景颜色的样式,但是无论做什么都不会改变。我正在使用最新的Firefox 29。 CSS中是否有一些规则更改,或者可能在浏览器中? CSS: 问题答案: 复选框无法设置样式。您将需要一个第三方js插件,这里有很多可用的插件。 如果要自己执行此操作,则基本上涉及隐藏复选框以创建一个元素并对其进行样式设置,然后将其click事件绑定到两个函数,一个用于更改其外观,另一个用于