首页 > 其他分享 >ThreeJS Shader的效果样例雷达图和大气层(二)

ThreeJS Shader的效果样例雷达图和大气层(二)

时间:2024-08-24 17:16:39浏览次数:11  
标签:ThreeJS 1.0 0.0 float 样例 Shader vec4 vec2 vec3

一、雷达图

   

 实现原理:图中是一个旋转的渐变扇形,可以通过先实现一个扇形、然后再实现一个渐变扇形,最后再将扇形旋转来达到最终效果

1. 实现一个夹角为O的扇形,已X轴正方向为单位向量M,UV点到(0,0)形成向量N,通过M和N的点乘就可以得到一个夹角,然后判断角度小于O就可以了

2. 实现扇形的渐变色,主要是通过smoothstep实现,smoothstep是在两个值之间取渐变值,这样就可以实现离X轴越远越暗的效果

3. 如何让扇形旋转起来呢,上面已经实现了一个扇形A,通过将扇形B按照一定角度旋转到A,就可以得到对应的渐变色颜色值了,这样一个渐变的旋转角度就可以实现一个旋转的渐变扇形

4. 实现蓝色线圈,也是通过smoothstep函数,一个smoothstep最后会生成0-1的跳变值,如果是两个smoothstep相减会生成一个波峰的颜色值

    

主要原理是先实现一个扇形渐变的区域,这个不是很复杂,然后通过不断渲染页面时,将该扇形旋转到某个角度即可

const vertex = '\
    varying vec2 vUv;\
    void main() {\
      vUv = uv;\
      vec4 modelPosition = modelMatrix * vec4(position, 1.0);\
      gl_Position = projectionMatrix * viewMatrix * modelPosition;\
    }\
  ';

  const frag = '\
    uniform float uTime;\
    varying vec2 vUv;\
    float drawCircle(vec2 vUv, float radius) {\
      float res = length(vUv);\
      float width = 0.005;\
      return smoothstep(radius - width, radius, res) - smoothstep(radius, radius + width, res);\
    }\
    float drawSector(vec2 vUv, float radius) {\
      float angle = uTime;\
      vec2 newvUv = mat2(cos(angle), sin(angle), -sin(angle), cos(angle)) * vUv;\
      vec2 x = vec2(1.0, 0.0);\
      vec2 y = vec2(0.0, 1.0);\
      float res = dot(newvUv, y);\
      float angle2 = acos(dot(x, normalize(newvUv)));\
      if (angle2 > 0.0 && angle2 < 1.5707 && length(newvUv) < 0.45 && res > 0.0) {\
        return 1.0 - smoothstep(0.0, 1.5707, angle2);\
      } else {\
        return 0.0;\
      }\
    }\
    void main() {\
      vec2 newvUv = vUv;\
      newvUv -= vec2(0.5);\
      vec3 color = vec3(0.0, 0.0, 0.0);\
      float circle = drawCircle(newvUv, 0.45);\
      float circle2 = drawCircle(newvUv, 0.3);\
      float circle3 = drawCircle(newvUv, 0.1);\
      color += circle + circle2 + circle3;\
      color += drawSector(newvUv, 0.45);\
      gl_FragColor = vec4(color * vec3(0.0, 1.0, 0.0), 1.0);\
    }\
  ';

 

三、遮罩层

1. 第一种方法:采用shader中法向量的概念,取法向量和球体上各个坐标点与相机形成的向量之间的点积,离相机位置越近,

  越靠近相机位置,点积值越大,且为正值,反之越远,则点积越小,同时可能为负值,这时候用产生的点积数据作为透明度,

  即可得到渐变的效果

var vertex    =
    'varying vec3    vVertexWorldPosition;\
    varying vec3    vVertexNormal;\
    varying vec4    vFragColor;\
    void main(){\
        vVertexNormal    = normalize(normalMatrix * normal);\
        vVertexWorldPosition    = (modelMatrix * vec4(position, 1.0)).xyz;\
        gl_Position    = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\
    }';

  var frag    =
    'uniform vec3    glowColor;\
    uniform float    coeficient;\
    varying vec3    vVertexNormal;\
    varying vec3    vVertexWorldPosition;\
    varying vec4    vFragColor;\
    void main(){\
            vec3 worldVertexToCamera = cameraPosition - vVertexWorldPosition;\
            vec3 viewCameraToVertex    = (viewMatrix * vec4(worldVertexToCamera, 0.0)).xyz;\
            viewCameraToVertex = normalize(viewCameraToVertex);\
            float intensity = coeficient + dot(vVertexNormal, viewCameraToVertex);\
            if (intensity < 0.0) {\
              gl_FragColor = vec4(vec3(0.0, 1.0, 0.0), 1.0);\
            } else {\
              gl_FragColor = vec4(glowColor, intensity);\
            }\
    }';

 

2. 第二种方法通过ThreeJS官方提供的样例,使用EffectCompose的方式来实现,其中也是通过添加shader着色器的原理实现的

 

标签:ThreeJS,1.0,0.0,float,样例,Shader,vec4,vec2,vec3
From: https://www.cnblogs.com/codeOnMar/p/18233673

相关文章

  • UE Shader 解读系列(一) ShadingCommon.ush
    UEShader解读系列(一)ShadingCommon.ush本文基于UE5.3.2是对ChatGPT给的解释进行的copy,不一定正确ShadingCommon.ush包含了UE的shader编写相关的基础定义和工具函数1.宏定义与条件编译#ifndefSHADING_PATH_MOBILE#defineSHADING_PATH_MOBILE0#endif#ifnd......
  • 看了几十篇论文,实现了个专业算法,用threejs做了个三维人员定位系统示例(已开源)
    需求“threejs中能不能给定几组三维坐标(或者CAD绘制的三维多段线),给一个断面形状,直接生成三维管道?”例如原始CAD图如下:要求用threejs获取线的三维坐标数据自动生成的三维管道效果图如下: 分析如果直接对每条线用threejs中的THREE.TubeGeometry去绘制的话,会出现交岔口出......
  • 深度剖析Cocos Creator中的Shader编程:从入门到精通,打造绚丽视觉效果!
    目录一、入门篇:Shader是什么?为什么我们需要它?二、基础知识:GLSL与CocosCreator的Shader语言三、实战演练:编写一个简单的Shader1.创建Shader文件2.编写GLSL代码3.应用Shader四、 编写复杂的Shader效果五、 性能优化六、示例:编写高斯模糊Shader顶点着色器(VS)片元......
  • AIGC新手炼丹师快速生成属于自己的lora--示范样例:北条时行(出自:擅长逃跑的殿下)
    目录一.准备工作:安装stable-diffusion和sd-trainer二.准备数据集2.1确定你想要的数据集2.2准备数据集2.2.1对于人物类的数据集2.2.2数据集的处理2.2.3数据集所在文件夹参考位置(出于方便考虑,仅供参考):2.2.4由数据集生成标签                  2.2.5......
  • poi实现多个word文档的合并测试代码样例
    提供一个代码样例实现使用poi工具包合并多个word文档:工具类MergeDocUtilspackagecom.yootii.bdy.util.test;importorg.apache.commons.collections.CollectionUtils;importorg.apache.poi.openxml4j.opc.OPCPackage;importorg.apache.poi.xwpf.usermodel.BreakType;im......
  • java注解与反射(非常详细, 带有很多样例)
    下面是详细地讲解Java中的注解与反射,并提供了很多的示例来帮助理解。Java注解(Annotations)1.注解的基本概念注解(Annotation)是Java5引入的一种用于为代码元素(类、方法、字段、参数等)添加元数据的机制。这些元数据可以在编译时、类加载时或运行时被读取并使用。注解......
  • java注解与反射(非常详细, 带有很多样例)
    下面是详细地讲解Java中的注解与反射,并提供了很多的示例来帮助理解。Java注解(Annotations)1.注解的基本概念注解(Annotation)是Java5引入的一种用于为代码元素(类、方法、字段、参数等)添加元数据的机制。这些元数据可以在编译时、类加载时或运行时被读取并使用。注解不会直......
  • Unity Shader 变体优化:提升性能的关键技巧
    在Unity开发中,Shader变体的管理和优化是提升游戏性能的重要环节。不合理的Shader变体可能导致性能下降、内存占用增加以及构建时间延长等问题。本文将深入探讨UnityShader变体优化的方法和技巧。一、理解Shader变体Shader变体是指通过不同的编译条件(如#pragma......
  • Unity Shader 变体优化案例
    以下是一些UnityShader变体优化的实践案例:案例一:材质纹理切换原始实现:#ifUSE_TEXTURE1sampler2Dtex1;#elsesampler2Dtex2;#endifvoidmain(){#ifUSE_TEXTURE1color=tex2D(tex1,uv);#elsecolor=tex2D(tex2,uv);......
  • Unity Shader动画:用代码绘制动态视觉效果
    在Unity中,Shader是运行在GPU上的小程序,用于控制顶点和像素的渲染过程。通过编写自定义Shader,开发者可以创造出各种令人惊叹的动画效果,从简单的颜色变化到复杂的流体模拟。本文将探讨如何使用UnityShader来实现动画效果。Shader动画简介Shader动画是指使用Shader代码来控......