3.js - 纹理的 magfilter、minFilter、各向异性过滤(各项异性解决倾斜模糊问题)

news2024/11/23 6:51:28

效果图,就是一个PlaneGeometry,加了一个贴图,再设置下面这些属性,你就放大缩小着看吧,反正我看不出什么来

在这里插入图片描述

代码


// @ts-nocheck
// 引入three.js
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 导入lil.gui
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
// 导入tween
import * as TWEEN from 'three/examples/jsm/libs/tween.module.js'
// 导入hdr加载器(专门加载hdr的)
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'
// 导入gltf加载器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'

//#region
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)
//#endregion

//#region
// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)

const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
// controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.05

// 每一帧根据控制器更新画面
function animate() {
  // 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`
  controls.update()
  // `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染
  requestAnimationFrame(animate)
  // 渲染
  renderer.render(scence, camera)
  // 更新tween
  TWEEN.update()
}
animate()
//#endregion

// --------------------------------------------------------------
// --------------------------------------------------------------

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`:线性过滤
	    当,纹理被放大时,每个屏幕像素,将映射到纹理中的多个像素,
	    并,使用这些像素的颜色进行线性插值(平均),以计算最终的颜色,
	    这种效果消耗大,但是,更加自然真实,不会像素化

// texture.magFilter = THREE.NearestFilter
// texture.magFilter = THREE.LinearFilter


------------------------------------------------------------------------------------


`magfilter`:纹理映射时的,缩小,过滤方式
	说一下子:
	  当纹理在屏幕上,小于其原始大小时(当纹理需要被缩小显示时),的过滤方式
	
	1`THREE.NearestFilter`:最近点过滤
	    直接选择最近的纹理像素,不进行任何插值;不适于,需要高质量的渲染效果,或快速渲染的场景
	    
	    但是,当纹理被缩小显示时,可能会看到明显的像素化(特别是在纹理与背景或其他物体交界处)
	
	2`THREE.LinearFilter`:线性过滤
	    这种方式,会在纹理像素之间进行线性插值,以生成更平滑的过渡;
	    它在纹理被缩小显示时,通常会产生更好的视觉效果,因为插值可以减少像素化效应;
	    但它的计算成本稍高,因为它需要计算更多像素的加权平均值;

// texture.minFilter = THREE.NearestFilter
// texture.minFilter = THREE.LinearFilter


------------------------------------------------------------------------------------


	1`THREE.LinearMipMapLinearFilter`:线性mipmap线性过滤
	
	      当选择,纹理的mipmap级别时,使用,线性插值,来选择两个最接近的mipmap级别;
	
	      在选定的mipmap级别内,也使用线性插值在纹理像素之间进行插值;
	
	      这种过滤方式通常能产生最平滑的纹理效果,尤其是在纹理与背景或其他物体交界处;
	
	
	2`THREE.LinearMipMapNearestFilter`:线性mipmap最近点过滤
	
	      当选择,纹理的mipmap级别时,使用,线性插值,来选择两个最接近的mipmap级别;
	
	      在选定的mipmap级别内,使用最近点插值(即直接选择最近的纹理像素);
	
	      这种过滤方式在mipmap级别之间具有平滑过渡,但在每个mipmap级别内部可能会看到像素化效应;

texture.minFilter = THREE.LinearMipMapLinearFilter
// texture.minFilter = THREE.LinearMipMapNearestFilter


------------------------------------------------------------------------------------


	1`THREE.NearestMipMapLinearFilter`:最近点mipmap线性过滤
	
	      当选择纹理的mipmap级别时,直接选择最近的mipmap级别;
	
	      在选定的mipmap级别内,使用线性插值在纹理像素之间进行插值;
	
	      这种过滤方式在mipmap级别之间可能具有较明显的过渡,但在每个mipmap级别内部具有平滑的纹理效果;
	
	2`THREE.NearestMipMapNearestFilter`:最近点mipmap最近点过滤
	
	      当选择纹理的mipmap级别时,直接选择最近的mipmap级别;
	
	      在选定的mipmap级别内,也直接选择最近的纹理像素;
	
	      这种过滤方式计算成本最低,但在纹理被缩小显示时可能会看到明显的像素化或块状效应;

// texture.minFilter = THREE.NearestMipMapLinearFilter
// texture.minFilter = THREE.NearestMipMapNearestFilter


------------------------------------------------------------------------------------


`【最重要的是】`
	
	为了使用mipmap过滤,需要确保,在加载纹理时启用了mipmap生成,
	
	即:将 TextureLoader 的 generateMipmaps 置为true


------------------------------------------------------------------------------------



各向异性过滤(`各项异性,解决倾斜模糊问题`):
  当你在屏幕上渲染一个纹理时,特别是从一个较远的视角观察一个较小的纹理时,你可能会遇到纹理失真或模糊的问题,
  因为,纹理的像素在屏幕上被拉伸或压缩。

  各向异性过滤,是一种用于减少这种纹理失真或模糊的技术,
  与传统的双线性或三线性过滤不同,各向异性过滤考虑了纹理在不同方向上的拉伸程度,并据此调整其采样模式。

  更高的各向异性级别,意味着,更少的纹理失真和更高的图像质量,但也可能需要更多的计算资源。


`总之,下面代码的意思是`:
  检查图形硬件支持的最大各向异性级别,并设置一个纹理的各向异性级别,
  这有助于,确保纹理在渲染时尽可能清晰,减少失真。

'从渲染器的功能(`capabilities`)中,获取支持的最大各向异性级别,不同的GPU和图形驱动程序可能支持不同的最大各向异性级别。'
let maxAnisotropy = renderer.capabilities.getMaxAnisotropy()

'设置纹理的各向异性级别为4,意味着,纹理过滤将考虑最多4个不同的方向来减少失真'
`【注意:如果你设置的级别,高于GPU支持的最大级别,它可能会被自动降低到最大支持的级别】`
texture.anisotropy = 4

console.log(maxAnisotropy)




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4、音视频封装格式---FLV

FLV FLV是一种容器封装格式,是由Adobe公司发布和维护的,用于将视频编码流与音频编码流进行封装。对于任意一种封装格式,都有其头部区域与数据区域,在FLV中,称之为FLV Header与Body。 对于FLV Header,一个FL…

31 C++11

本节目标 c11简介列表初始化变量类型推导范围for循环新增加容器右值新的类功能可变参数模板 1. c11简介 在2003年标准委员会提交了一份计数勘误表(简称TC1),使得c03这个名字已经取代了c98称为c11之前的最新的c标准名称。不过由于c03&#x…

【桌面微信多开】

桌面微信多开 步骤一:新建txt步骤二:保存修改为.bat步骤三:双击运行程序步骤四:多次点击微信 步骤一:新建txt echo offstart /d "D:\program\WeChat\" WeChat.exestart /d "D:\program\WeChat\" …

Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议

一、项目要求 实现自定义私有协议,如:pc端产生数据:02 56 38 ,“02”代表要发送数据的个数,“56”“38”需要写进RAM中。当按键信号到来时,将“56”“38”读出返回给PC端。 二、信号流向图 三、状态…

MessageBox的作用与用法

在C# ( Windows Forms )中,MessageBox 的所有常用用法如下: 1. 显示一个简单的消息框 MessageBox.Show("这是一个简单的消息框。");2. 显示带标题的消息框 MessageBox.Show("这是一个带标题的消息框。", &…

美国服务器租用详细介绍与租用流程

在数字化时代,服务器租用已成为许多企业和个人拓展业务、存储数据的重要选择。美国作为全球科技发展的前沿阵地,其服务器租用服务也备受瞩目。下面,我们将详细介绍美国服务器租用的相关知识及租用流程。 一、美国服务器租用简介 美国服务器租…

PDI-kettle工具连接本地虚拟机Ubuntu上的数据库

PDI 配置ubuntu数据库配置Kettle工具 PDI版本&#xff1a;9.4 Ubuntu2204&#xff1a;10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04 配置ubuntu数据库 安装 apt install -y mariadb-server配置监听地址 cat > /etc/mysql/mariadb.conf.d/99-kettle.cnf << EOF …

结构体------“成绩排序”---冒泡----与“输出最高成绩”区别

从大到小或者从小到大排序----冒泡排序---双重循环i,j 比较的时候用的是 排序的时候用的是整体 stu [ j1 ] 和 stu [ j ] 我写错为下面这个&#xff0c;交换的只是学生的出生日期&#xff0c;没有交换整体 #include<stdio.h> #include<string.h>struct student{ch…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…

仰邦BX.K协议对接

背景 使用BX 6K控制卡控制诱导屏显示剩余车位数&#xff0c;由于控制卡和服务端不在一个局域网内&#xff0c;所以不能使用官网提供的案例&#xff0c;官网提供的案例为控制卡为TCP Server&#xff0c;服务端为TCP Client&#xff0c;因此需要开发此程序&#xff0c;服务端左右…

docker mysql cpu100% cpu打满排查 mysql cpu爆了 mysql cpu 100%问题排查

1. docker 启动了一个mysql 实例&#xff0c;近期忽然发现cpu100% 如下图所示 命令&#xff1a; top 2.进入容器内排查&#xff1a; docker exec mysql&#xff08;此处可以是docker ps -a 查找出来的image_id&#xff09; -it /bin/bash cd /var/log cat mysqld.log 容器内m…

Android LayoutInflater 深度解析

在 Android 开发中&#xff0c;LayoutInflater 是一个非常重要的工具。它允许我们从 XML 布局文件中动态地创建 View 对象&#xff0c;从而使得 UI 的创建和管理更加灵活。本文将深入解析 android.view.LayoutInflater&#xff0c;包括它的基本用法、常见问题以及高级用法。 什…

Java高级重点知识点-19-Lambda

文章目录 Lambda表达式函数式编程思想Lambda表达式写法代码讲解 Lambda表达式 函数式编程思想 强调做什么&#xff0c;而不是以什么形式做。 以函数式接口Runnable为例讲解&#xff1a; public class LambdaDemo {public static void main(String[] args) {Runnable runnab…

学习无人机飞行技术,有哪些就业方向?

随着无人机技术的不断进步和应用领域的拓展&#xff0c;研发创新人才的需求也将不断增加&#xff0c;那就业前景还是很广阔的。学习无人机飞行技术后&#xff0c;有以下多个就业方向可供选择&#xff1a; 1. 无人机操作员&#xff1a; - 负责操控和监控无人机飞行&#xff0c;…

第57期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

“探索价值增长消费:让每一笔购物都成为增值之旅“

亲爱的顾客们&#xff0c;你们好&#xff01;今天&#xff0c;我将带你们探索一种革命性的消费哲学——价值增长消费&#xff0c;让每一次购物都成为一次增值之旅&#xff01; 在传统消费观念里&#xff0c;我们付出金钱换取商品或服务&#xff0c;随后这些便成为过去。但如今…

38. 扫描系统设计

导论: 扫描系统根据反射旋转类型分为平面振镜扫描和转股扫描&#xff0c;根据光路途径分为一维、二维和三维扫描&#xff0c;根据振镜和扫描镜头的位置又可分为镜前扫描和镜后扫描。 设计流程&#xff1a; zemax设计与优化&#xff1a; 系统建模 在孔径类型中选择入瞳直径…

fastapi swagger js css 国内访问慢问题解决

fastapi swagger js css 国内访问慢问题解决 直接修改fastapi包中静态资源地址为如下地址 swagger_js_url: str "https://cdn.bootcdn.net/ajax/libs/swagger-ui/3.9.3/swagger-ui-bundle.js", swagger_css_url: str "https://cdn.bootcdn.net/ajax/libs/sw…

发电机保护屏的作用及其重要性

发电机保护屏的作用及其重要性 发电机保护屏是电力系统中的重要组成部分&#xff0c;它负责监测和控制发电机的运行状态&#xff0c;确保发电机在正常运行和故障情况下都能得到及时、准确的保护。负责监测和控制发电机运行状态&#xff0c;确保及时准确的保护。它由显示屏、控制…