效果图,就是一个PlaneGeometry,加了一个贴图,再设置下面这些属性,你就放大缩小着看吧,反正我看不出什么来
代码
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
import * as TWEEN from 'three/examples/jsm/libs/tween.module.js'
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
const scence = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(2, 2, 5)
camera.lookAt(0, 0, 0)
const renderer = new THREE.WebGLRenderer({
antialias: true
})
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)
const controls = new OrbitControls(camera, renderer.domElement)
controls.dampingFactor = 0.05
function animate() {
controls.update()
requestAnimationFrame(animate)
renderer.render(scence, camera)
TWEEN.update()
}
animate()
const textureLoader = new THREE.TextureLoader()
let texture = textureLoader.load('../public/assets/texture/brick/brick_diffuse.jpg')
let planeGeometry = new THREE.PlaneGeometry(1, 1)
let material = new THREE.MeshBasicMaterial({
color: 0xffffff,
map: texture,
transparent: true
})
const plane = new THREE.Mesh(planeGeometry, material)
scence.add(plane)
`纹理的色彩空间`(srgb模式,纹理看起会更加真实);(默认是线性模式,看起来会比较白,不真实)
texture.colorSpace = THREE.SRGBColorSpace
`magfilter`:纹理映射时的,放大,过滤方式
说一下子:
当纹理被映射到一个比其原始尺寸更大的表面时(当纹理像素需要被放大,以覆盖多个屏幕像素时),
就需要使用放大过滤
1、`THREE.NearestFilter`:最近点过滤
当,纹理被放大时,每个屏幕像素,将直接映射到纹理中的最近像素,
而不会,对纹理像素进行任何插值或平滑处理,
这可能会导致,纹理在放大时显得块状或像素化
2、`THREE.LinearFilter`:线性过滤
当,纹理被放大时,每个屏幕像素,将映射到纹理中的多个像素,
并,使用这些像素的颜色进行线性插值(平均),以计算最终的颜色,
这种效果消耗大,但是,更加自然真实,不会像素化
------------------------------------------------------------------------------------
`magfilter`:纹理映射时的,缩小,过滤方式
说一下子:
当纹理在屏幕上,小于其原始大小时(当纹理需要被缩小显示时),的过滤方式
1、`THREE.NearestFilter`:最近点过滤
直接选择最近的纹理像素,不进行任何插值;不适于,需要高质量的渲染效果,或快速渲染的场景
但是,当纹理被缩小显示时,可能会看到明显的像素化(特别是在纹理与背景或其他物体交界处)
2、`THREE.LinearFilter`:线性过滤
这种方式,会在纹理像素之间进行线性插值,以生成更平滑的过渡;
它在纹理被缩小显示时,通常会产生更好的视觉效果,因为插值可以减少像素化效应;
但它的计算成本稍高,因为它需要计算更多像素的加权平均值;
------------------------------------------------------------------------------------
1、`THREE.LinearMipMapLinearFilter`:线性mipmap线性过滤
当选择,纹理的mipmap级别时,使用,线性插值,来选择两个最接近的mipmap级别;
在选定的mipmap级别内,也使用线性插值在纹理像素之间进行插值;
这种过滤方式通常能产生最平滑的纹理效果,尤其是在纹理与背景或其他物体交界处;
2、`THREE.LinearMipMapNearestFilter`:线性mipmap最近点过滤
当选择,纹理的mipmap级别时,使用,线性插值,来选择两个最接近的mipmap级别;
在选定的mipmap级别内,使用最近点插值(即直接选择最近的纹理像素);
这种过滤方式在mipmap级别之间具有平滑过渡,但在每个mipmap级别内部可能会看到像素化效应;
texture.minFilter = THREE.LinearMipMapLinearFilter
------------------------------------------------------------------------------------
1、`THREE.NearestMipMapLinearFilter`:最近点mipmap线性过滤
当选择纹理的mipmap级别时,直接选择最近的mipmap级别;
在选定的mipmap级别内,使用线性插值在纹理像素之间进行插值;
这种过滤方式在mipmap级别之间可能具有较明显的过渡,但在每个mipmap级别内部具有平滑的纹理效果;
2、`THREE.NearestMipMapNearestFilter`:最近点mipmap最近点过滤
当选择纹理的mipmap级别时,直接选择最近的mipmap级别;
在选定的mipmap级别内,也直接选择最近的纹理像素;
这种过滤方式计算成本最低,但在纹理被缩小显示时可能会看到明显的像素化或块状效应;
------------------------------------------------------------------------------------
`【最重要的是】`
为了使用mipmap过滤,需要确保,在加载纹理时启用了mipmap生成,
即:将 TextureLoader 的 generateMipmaps 置为true
------------------------------------------------------------------------------------
各向异性过滤(`各项异性,解决倾斜模糊问题`):
当你在屏幕上渲染一个纹理时,特别是从一个较远的视角观察一个较小的纹理时,你可能会遇到纹理失真或模糊的问题,
因为,纹理的像素在屏幕上被拉伸或压缩。
各向异性过滤,是一种用于减少这种纹理失真或模糊的技术,
与传统的双线性或三线性过滤不同,各向异性过滤考虑了纹理在不同方向上的拉伸程度,并据此调整其采样模式。
更高的各向异性级别,意味着,更少的纹理失真和更高的图像质量,但也可能需要更多的计算资源。
`总之,下面代码的意思是`:
检查图形硬件支持的最大各向异性级别,并设置一个纹理的各向异性级别,
这有助于,确保纹理在渲染时尽可能清晰,减少失真。
'从渲染器的功能(`capabilities`)中,获取支持的最大各向异性级别,不同的GPU和图形驱动程序可能支持不同的最大各向异性级别。'
let maxAnisotropy = renderer.capabilities.getMaxAnisotropy()
'设置纹理的各向异性级别为4,意味着,纹理过滤将考虑最多4个不同的方向来减少失真'
`【注意:如果你设置的级别,高于GPU支持的最大级别,它可能会被自动降低到最大支持的级别】`
texture.anisotropy = 4
console.log(maxAnisotropy)