threejs边缘暗角shader

2023-10-19 01:20
文章标签 shader 边缘 threejs 暗角

本文主要是介绍threejs边缘暗角shader,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

边缘暗角以及锯齿处理

  • 效果
  • 引入库
  • shader
  • 窗口监测里添加
  • 添加效果合成器
  • 处理模型边缘锯齿
  • 渲染
  • 后续


效果

在这里插入图片描述

引入库

import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass'
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'
import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass'
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'
import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader'

shader

var DarkMaskShader = {uniforms: {'tDiffuse': {value: null},'maskColor': {value: new THREE.Color(0x000000)},'maskAlpha': {value: 1.0},'markRadius': {value: 0.15},'smoothSize': {value: 0.5}},vertexShader: ['varying vec2 vUv;','void main() {','	vUv = uv;','	gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );','}'].join('\n'),fragmentShader: ['uniform float maskAlpha;','uniform vec3 maskColor;','uniform float markRadius;','uniform float smoothSize;','uniform sampler2D tDiffuse;','varying vec2 vUv;','float sdfCircle(vec2 coord, vec2 center, float radius)','{','	vec2 offset = coord - center;','	return sqrt((offset.x * offset.x) + (offset.y * offset.y)) - radius;','}','void main() {','	vec4 texel = texture2D( tDiffuse, vUv );','   float sdfValue = sdfCircle(vUv, vec2(0.5, 0.5), markRadius);','	if (sdfValue < 0.0){',' 		gl_FragColor = texel;','	}else{','		float a = smoothstep(0.0, smoothSize, sdfValue);','   	gl_FragColor = mix(texel, vec4(maskColor, maskAlpha), a);','	}','}'].join('\n')
}

窗口监测里添加

function onWindowResize() {camera.aspect = document.getElementById('threecanvas').offsetWidth / document.getElementById('threecanvas').offsetHeightcamera.updateProjectionMatrix()/*********************************************************************/// 暗角范围composer.setSize(document.getElementById('threecanvas').offsetWidth, document.getElementById('threecanvas').offsetHeight) // 暗角renderer.setSize(document.getElementById('threecanvas').offsetWidth, document.getElementById('threecanvas').offsetHeight)
}

添加效果合成器

function initEffectComposer() {// 处理模型闪烁问题【优化展示网格闪烁】const parameters = { format: THREE.RGBFormat }const size = renderer.getDrawingBufferSize(new THREE.Vector2())const renderTarget = new THREE.WebGLMultisampleRenderTarget(size.width, size.height, parameters)/******************************************边缘暗角****************************************/renderScene = new RenderPass(scene, camera)renderScene.clear = trueconst effectDarkMask = new ShaderPass(DarkMaskShader)composeraj = new EffectComposer(renderer, renderTarget)composeraj.addPass(renderScene)composeraj.addPass(effectDarkMask)// 开启圆形暗角,需要处理模型边缘失真
}

处理模型边缘锯齿

添加特效合成器后,会出现模型边缘锯齿
推荐使用 FXAA 处理
具体请到:

// 效果合成器,shader渲染使用
function initEffectComposer() {// 处理模型闪烁问题【优化展示网格闪烁】const parameters = { format: THREE.RGBFormat }const size = renderer.getDrawingBufferSize(new THREE.Vector2())const renderTarget = new THREE.WebGLMultisampleRenderTarget(size.width, size.height, parameters)/******************************************边缘暗角****************************************/renderScene = new RenderPass(scene, camera)renderScene.clear = trueconst effectDarkMask = new ShaderPass(DarkMaskShader)composeraj = new EffectComposer(renderer, renderTarget)composeraj.addPass(renderScene)composeraj.addPass(effectDarkMask)// 开启圆形暗角,需要处理模型边缘失真/*********************************************特效锯齿处理****************************************/// 增加fxaashader处理模型边缘锯齿,开启EffectComposer后才能生效【开启特效合成之后的展示优化】var FXAAShaderPass = new ShaderPass(FXAAShader)const pixelRatio = renderer.getPixelRatio()const width = document.getElementById('threecanvas').offsetWidthconst height = document.getElementById('threecanvas').offsetHeightFXAAShaderPass.uniforms['resolution'].value.set(1 / (width * pixelRatio), 1 / (height * pixelRatio))FXAAShaderPass.renderToScreen = truecomposeraj.addPass(FXAAShaderPass)
}

渲染

渲染部分,如果添加了特效合成器,则要把传统的渲染方式替换为特效的通道

// 渲染
function render() {update()requestAnimationFrame(render)// 执行一个动画.并在动画执行后重新渲染// 传统渲染器,如果使用shader着色器,则注掉这个,增加效果合成器,增加通道渲染 // renderer.render(scene, camera)composeraj.render()
}

后续

这一部分特效也是参考了大部分其他知乎、博客、简书等等…
话说,找一个特效真难,搜到的好的特效后边都是两个字,买断 &T~T&,都拿去作商业用途了,如果一个小白从头开始,跟着three官网做一些基础的三维物体或基础场景还是可以的,那些进阶的东西,特效、动效什么的,真的是难找的要死,现在学个东西,自学还真是难啊,高级一点的接触都接触不到,像我这样的,自己扣一扣底层代码,然后往上一步一个坑真的难的一批,各种搜索,找一找成型的源码,自己对照着底层,硬理解,难搞。 想速成的话…多花钱,想按部就班的搞一搞,吃的透就要从简到繁,从底层到显示…一步一坑,从three进去,到webgl,再看OpenGL,对照底层封装three上的缺陷,然后完善,形成一套自己的基础引擎。

这篇关于threejs边缘暗角shader的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236359

相关文章

2024年AI芯片峰会——边缘端侧AI芯片专场

概述 正文 存算一体,解锁大模型的边端侧潜力——信晓旭 当下AI芯片的亟需解决的问题 解决内存墙问题的路径 产品 面向大模型的国产工艺边缘AI芯片创新与展望——李爱军 端侧AI应用“芯”机遇NPU加速终端算力升级——杨磊 边缘端的大模型参数量基本小于100B AI OS:AI接口直接调用AI模型完成任务 具身智能的大脑芯片 大模

外部中断的边缘触发和电平触发

MCS-51单片机中的边缘触发是指当输入引脚电平由高到低发生跳变时,才引起中断。而电平触发是指只要外部引脚为低电平就引起中断。         在电平触发方式下,当外部引脚的低电平在中断服务返回前没有被拉高时(即撤除中断请求状态),会引起反复的不需要的中断,造成程序执行的错误。这类中断方式下,需要在中断服务程序中设置指令,清除外部中断的低电平状态,使之变为高电平。

从零开始学cv-14:图像边缘检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、图像边缘是什么?二、Sobel 算子三、Scharr 算子四、Prewitt算子五、Canny算子 前言 边缘检测是OpenCV中的一个重要组成部分,它用于识别图像中亮度变化显著的点,即边缘。通过边缘检测,我们可以从图像中提取出重要的特征,为后续的图像分析、形状识别和物体跟踪等任务奠定

Unity3D Shader详解:只画顶点或只画线框

在Unity3D开发中,Shader是控制渲染过程的关键组件,它允许开发者自定义物体的渲染方式。有时,为了特定的视觉效果,我们可能需要只渲染模型的顶点或者只显示其线框。下面,我们将详细探讨这两种效果的技术实现,并给出相应的代码示例。 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 只画顶点 在Unity中直接“只画顶点”的概念可能不是非常直观,因为顶点本身只是模型

unity shader实现一个移动的箭头

Shader "Unlit/LT_Arrow" {     Properties     {         _MainTex ("Texture", 2D) = "white" {}         _MSpeed("MoveSpeed", Range(1, 3)) = 2 //移动速度     }     SubShader     {         //贴图带透明通道 ,半透明效果设置如下

边缘检测运用

文章目录 一、简介1.边缘检测的概念2.边缘检测的目的 二、代码实现三、边缘检测的方法1.1Canny边缘检测器1.2.Canny代码实现2.1Sobel边缘检测器2.2Sobel代码实现3.1Laplacian边缘检测器3.2Laplacian代码实现4.1Scharr边缘检测器4.2Scharr代码实现 四、边缘检测的应用 一、简介 边缘检测是图像处理和计算机视觉中的一个基本

当小程序遭遇攻击或超出流量峰值时:SCDN边缘加速的高效防护策略!

在数字化时代,小程序因其便捷性和丰富的功能而备受用户喜爱,但这也使其成为了网络攻击的目标之一。DDoS攻击、CC攻击等不仅会影响小程序的正常运行,还会损害用户体验和品牌形象。在这种情况下,选择合适的安全防护措施至关重要。边缘加速提供了一体化的分布式安全防御解决方案,能够有效应对这些问题。 Edge SCDN边缘加速的核心功能 Edge SCDN边缘加速是一款一体化分布式安全防御产品,它不仅提供

fpga图像处理实战-边缘检测 (Roberts算子)

Roberts算子         Roberts算子是一种用于边缘检测的算子,主要用于图像处理中检测图像的边缘。它是最早的边缘检测算法之一,以其计算简单、速度快而著称。Roberts算子通过计算图像像素在对角方向的梯度来检测边缘,从而突出图像中灰度变化最剧烈的部分。 原理             Roberts算子通过对图像应用两个2x2的卷积核(也称为掩模或滤波器)来计算图像在水平和垂直

实战赢家:为何传统边缘分割方法比深度学习更有效?附源码+教学+数据

前言 传统的边缘分割方法,如Canny边缘检测和Sobel算子,已经在计算机视觉领域中使用了数十年。这些方法依赖于图像梯度和边缘强度来识别边缘,通过一系列精心设计的滤波器和阈值化步骤来实现高效的边缘检测。虽然这些方法较为简单,但它们的计算开销低,效果稳定,并且能够在资源有限的环境中实现快速处理。随着技术的发展,这些传统算法不断优化,并与现代技术结合,展现出在特定应用场景中优于深度学习模型的独

图像边缘检测技术详解:利用OpenCV实现Sobel算子

图像边缘检测技术详解:利用OpenCV实现Sobel算子 前言Sobel算子的原理代码演示结果展示结语 前言   在数字图像处理的广阔领域中,边缘检测技术扮演着至关重要的角色。无论是在科学研究、工业自动化,还是在日常生活中的智能设备中,我们都需要从图像中提取有用的信息。边缘,作为图像中亮度变化最显著的地方,为我们提供了识别和理解图像内容的关键线索。因此,边缘检测算法成为了计算机视