Cesium版本升级webgl问题,glsl代码报错,修改办法

这篇具有很好参考价值的文章主要介绍了Cesium版本升级webgl问题,glsl代码报错,修改办法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

  Cesium 从1.102.0 开始,Cesium 默认使用 WebGL2 上下文。一些webgl特效代码在webgl1中支持,但是在版本升级后,运行会报各种glsl代码错误。现在有两种解决方案。详细办法描述如下所示。

1、修改配置使用WebGL1

  地球初始化配置如下:requestWebgl1: true

var viewer = new Cesium.Viewer("cesiumContainer", {
      geocoder: false, // 是否显示geocoder小器件,右上角查询按钮
      homeButton: false, // 是否显示Home按钮
      infoBox: false, // 点击要素之后显示的信息,默认true
      selectionIndicator: false, // 是否显示 entity 选中标识
      sceneModePicker: false, // 是否显示3D/2D选择器
      navigationHelpButton: false, // 是否显示右上角的帮助按钮
      animation: false, // 是否创建动画小器件,左下角仪表
      timeline: false, // 是否显示时间轴
      vrButton: false, // 是否显示虚拟按钮
      fullscreenButton: true, // 是否显示全屏按钮
      contextOptions: {
         // cesium状态下允许canvas转图片convertToImage
        webgl: {
          alpha: true,
          depth: false,
          stencil: true,
          antialias: true,
          premultipliedAlpha: true,
          preserveDrawingBuffer: true,//通过canvas.toDataURL()实现截图需要将该项设置为true
          failIfMajorPerformanceCaveat: false, 
        },
        allowTextureFilterAnisotropic: true,
        requestWebgl1: true, //设置使用Webgl1
     }
 });

2、修改glsl代码使用webgl2

  需要修改的关键字为: varying attribute texture2D gl_FragColor

  其中 texture2D  修改为 texture

   gl_FragColor    修改为    out_FragColor

而   varying attribute 修改为 out in 需要看glsl代码上下文。例如下文中varying声明参数v_st使用时在=右边,意味着需要参数输入,所以修改为in

    

    // 片元着色器

    // 修改前
    uniform sampler2D heatmap;
    varying vec2 v_st;

	void main()
	{
		vec4 color = texture2D(heatmap,v_st);
		gl_FragColor = color;
    // 修改后
    uniform sampler2D heatmap;
    in vec2 v_st;
	void main()
	{
		vec4 color = texture(heatmap,v_st);
		out_FragColor = color;
	}

  假如声明参数只在=左边使用,则需要修改为out。使用3d热力图glsl代码举例如下:

  修改的参数为:

webgl1声明 参数 webgl2声明
attribute

position3DHigh

 in

attribute

position3DLow

 in

attribute

st

 in

varying 

v_st

out

varying

v_ratio

out

  修改前支持webgl1:

   // 顶点着色器

     // 修改前
        attribute vec3 position3DHigh;
        attribute vec3 position3DLow;
        attribute vec2 st;
        varying vec2 v_st;
        uniform sampler2D grey;
		uniform float u_max_height;
		uniform vec4 u_bezier;
		uniform float radius;
		varying float v_ratio;

		vec2 toBezierInner(float t, vec2 P0, vec2 P1, vec2 P2, vec2 P3) {
			float t2 = t * t;
			float one_minus_t = 1.0 - t;
			float one_minus_t2 = one_minus_t * one_minus_t;
			return (P0 * one_minus_t2 * one_minus_t + P1 * 3.0 * t * one_minus_t2 + P2 * 3.0 * t2 * one_minus_t + P3 * t2 * t);
		}

		vec2 toBezier(float t, vec4 p) {
			return toBezierInner(t, vec2(0.0, 0.0), vec2(p.x, p.y), vec2(p.z, p.w), vec2(1.0, 1.0));
		}

        void main()
        {
          float gradient = texture2D(grey,st).r;

		  float height = toBezier(gradient, u_bezier).y;
		  float height0 = toBezier(0.0, u_bezier).y;
		  float height1 = toBezier(1.0, u_bezier).y;
		 
		  float ratio = (height - height0) / (height1 - height0);
		  height = ratio * u_max_height;
		  v_ratio = ratio;
          vec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow);
          p.z += height;
          p = czm_modelViewProjectionRelativeToEye * p;
          v_st = st;
          gl_Position = p;
        }

修改后代码支持webgl2:

    in vec3 position3DHigh;
    in vec3 position3DLow;
    in vec2 st;
    out vec2 v_st;
    uniform sampler2D grey;
		uniform float u_max_height;
		uniform vec4 u_bezier;
		uniform float radius;
		out float v_ratio;

		vec2 toBezierInner(float t, vec2 P0, vec2 P1, vec2 P2, vec2 P3) {
			float t2 = t * t;
			float one_minus_t = 1.0 - t;
			float one_minus_t2 = one_minus_t * one_minus_t;
			return (P0 * one_minus_t2 * one_minus_t + P1 * 3.0 * t * one_minus_t2 + P2 * 3.0 * t2 * one_minus_t + P3 * t2 * t);
		}

		vec2 toBezier(float t, vec4 p) {
			return toBezierInner(t, vec2(0.0, 0.0), vec2(p.x, p.y), vec2(p.z, p.w), vec2(1.0, 1.0));
		}

        void main()
        {
          float gradient = texture(grey,st).r;

		  float height = toBezier(gradient, u_bezier).y;
		  float height0 = toBezier(0.0, u_bezier).y;
		  float height1 = toBezier(1.0, u_bezier).y;
		 
		  float ratio = (height - height0) / (height1 - height0);
		  height = ratio * u_max_height;
		  v_ratio = ratio;


          vec4 p = czm_translateRelativeToEye(position3DHigh, position3DLow);
          p.z += height;
          p = czm_modelViewProjectionRelativeToEye * p;
          v_st = st;
          gl_Position = p;
        }

举例glsl代码为3d热力图效果,截图如下:

cesium webgl,cesium,javascript,开发语言,前端,webgl,3d文章来源地址https://www.toymoban.com/news/detail-741212.html

到了这里,关于Cesium版本升级webgl问题,glsl代码报错,修改办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter & Android问题记录 - 升级Android Studio 2022.2.1版本后运行项目报错

    最近一个Flutter项目有新需求,开发时一直是在iOS设备上运行,花了几天做完后运行到Android设备测试,结果项目构建失败了。 Flutter: 3.7.11 Android Studio: 2022.2.1 Java: 17.0.6 Gradle: 7.4 Android Gradle Plugin (AGP): 4.1.3 项目构建报错日志: 报错有点眼熟,根据以往开发经验,应该是Gradle版本

    2023年04月24日
    浏览(61)
  • Unity WebGL项目打包后本地打开报错问题解决方法

    在Unity打包WebGL项目后,本地打开html页面出现错误提示。 Failed to download file Build/Unity Web.data.gz. Loading web pages via a file:// URL without a web server is not supported by this browser.   在网上试了好几种方法,综合起来终于跑起来了。以下是解决步骤: 1. 打开Web服务 ,打开控制面板--程序--启

    2024年02月14日
    浏览(44)
  • WebGL,Cesium以及GeoJSON数据的简单介绍

    目录 一、WebGL 二、Cesium (1)Cesium:一个用于显示三维地球和地图的开源js库。 (2)Cesium的基本功能: (3)cesium的依赖性与技术标准 (4)Cesium与周边产品的关系 (5)Cesium viewer界面部件介绍 三、GeoJSON数据 【GeoJSON数据】 【GeoJSON 对象 】 1 几何图形 2 Feature 3 特征集合 【可

    2024年02月12日
    浏览(44)
  • Java升级JDK17(更高版本同理),修改maven

    记住三个网址就行:下面这个是oracle的 Java Platform, Standard Edition 17 ReferenceImplementations https://www.oracle.com/java/technologies/downloads/#jdk17-windows 另外一个 redhat旗下的:这个是开源的(推荐这个!) Red Hat build of OpenJDK Download | Red Hat Developer 找到想要的版本下载即可 注意:JDK9的时候,

    2024年02月11日
    浏览(46)
  • Linux MinIO 安装与配置 版本升级 数据迁移 修改密码

    Minio是一个轻量级、高性能的对象存储服务,支持多云环境,并且可以在大部分操作系统上运行,包括Linux、Windows、MacOS等。下面我们来看一下如何在Linux上搭建一个Minio。 安装Minio 1、需要下载Minio的二进制包。可以从官网下载,也可以使用命令行下载( 会比较久耐心等待)

    2024年04月14日
    浏览(30)
  • npm版本升级报错

    解决方法: 执行npm install --legacy-peer-deps依赖对等 npm install xxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v4-v6的方式去继续执行安装操作(默认使用npm 4-6版本的安装模式,安装过程

    2024年02月10日
    浏览(31)
  • tomcat版本升级-启动报错

    根本原因是关闭 ApplicationContext 时, 它将销毁所有单例 bean, eurekaAutoServiceRegistration 首先销毁, 然后销毁feignContext. 销毁 feignContext 时, 它将关闭与每个 FeignClient 关联的 ApplicationContext. 由于eurekaAutoServiceRegistration 监听 ContextClosedEvent, 因此这些事件将发送到该bean. 不幸的是, 由于它已

    2024年02月13日
    浏览(97)
  • Unity webgl 版本崩溃提示Memory access out of bounds 系列问题巨坑

     如上图所示,这真的是个巨坑,只有火狐浏览器可以正常打开,其他浏览器都报上面的错误,百度,翻墙,查找各种办法解决之后无果,只是得出一个结论,有N种原因都可能导致这个问题的出现。 既然不知道问题的原因,那就只能自己测试,在尝试了无数遍资源优化打包测

    2024年02月11日
    浏览(39)
  • node、npm版本升级,同时解决升级后vue项目运行报错

    1、首先,需要确定当前安装的Node.js的版本。可以通过在命令行中运行以下命令来查看: 2、如果当前版本较旧,可以考虑升级到最新版本。可以访问Node.js官方网站(https://nodejs.org/)下载最新的Node.js安装包。 不想下载最新的版本,也可以查看历史版本进行下载 3、在安装完成

    2024年02月10日
    浏览(59)
  • SuperMap iClient3D for WebGL/Cesium端性能优化

        目录 一、请求优化 1.1 多子域 1.1.1 scene.open()打开场景 1.1.2 加载地形 1.1.3 加载影像 1.1.4 加载S3M 1.1.5 加载MVT 1.2 批量请求 1.2.1 地形 1.2.2 影像 二、内存优化 2.1 根节点驻留内存 2.2 自动释放缓存 2.3 内存管理 三、图层优化 3.1 LOD 3.2 空间索引 3.3 控制图层显示范围 3.4 控制图层

    2024年01月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包