three.meshline包MeshLineMaterial顶点着色器报错 ‘isPerspectiveMatrix‘ : no matching overloaded function found

本文主要是介绍three.meshline包MeshLineMaterial顶点着色器报错 ‘isPerspectiveMatrix‘ : no matching overloaded function found,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 问题描述

使用three.meshline包,实例化MeshLineMaterial运行,控制台报错(three.js1版本0.141.0, three.meshline版本1.4.0),如下图所示:
报错内容

three.module.js?6573:18994 THREE.WebGLProgram: Shader Error 0 - VALIDATE_STATUS falseProgram Info Log: Vertex shader is not compiled.ERROR: 0:148: 'isPerspectiveMatrix' : no matching overloaded function found143:     gl_Position = finalPosition;144: 145: #ifdef USE_LOGDEPTHBUF146: 	#ifdef USE_LOGDEPTHBUF_EXT147: 		vFragDepth = 1.0 + gl_Position.w;
> 148: 		vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );149: 	#else150: 		if ( isPerspectiveMatrix( projectionMatrix ) ) {151: 			gl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;152: 			gl_Position.z *= gl_Position.w;153: 		}154: 	#endif

2. 解决思路

  • 首先看报错信息:Vertex shader说明为顶点着色器,错误内容——isPerspectiveMatrix没有找到匹配的重载函数。那么干脆给它加上一个匹配的重载函数呗。
  • 浅浅打个日志,看下这个材质实例化后,对象的结构,和顶点着色器具体的内容。
     console.log("meshLineMaterial", meshLineMaterial);

控制台输出
从对象中找到顶点着色器(vertexShader
顶点着色器位置

  • 由此可见,可以直接在vertexShader的前面加上isPerspectiveMatrix的定义, 具体操作方式如下:
 meshLineMaterial.vertexShader = `bool isPerspectiveMatrix(mat4) {return true;}` + meshLineMaterial.vertexShader;
  • 再次运行后,控制台报错果然消失,可以正常运行。

3. 关键代码

以下是部分代码(主要是生成曲线和生成MeshLine的部分)。

  // 要绘制的路径上的一些关键点,每3个一组 const pointArr = [121.78093686863522, 0, -4.603376409073572,121.81339509799925, 0, -1.0333897782644268,88.18838269349277, 0, -1.0333897782644268,88.18838269349277, 0, 63.55900780432629,87.16531645200739, 0, 68.04794277498671,83.06620769318347, 0, 70.98695971872945,-1.130897005741467, 0, 70.34667258938468,-5.231039038271652, 0, 68.42613876317515,-7.758389327064392, 0, 64.62409029746112,-7.758389327064392, 0, 46.44123345882236,-114.62656106119152, 0, 46.44123345882236,-119.82497669490243, 0, 44.45968445743292,-121.94606515130032, 0, 39.4725534305143,-121.94606515130032, 0, -42.76532835182727,-120.11831411582477, 0, -48.53850237391983,-116.83579669695663, 0, -49.908124030849784,78.54313968215955, 0, -49.908124030849784,85.10694214192533, 0, -50.16532666595109,89.88557886450108, 0, -55.064547179368375,89.88557886450108, 0, -93.93831946321087,91.96632492268847, 0, -98.37744840781204,95.1920071430169, 0, -100.1746448114269,152.736779207395, 0, -100.1746448114269,157.30932898344975, 0, -96.64823157224308,160.4735065923067, 0, -99.846029526487,302.4743190232127, 0, -99.846029526487,307.28097694970387, 0, -98.29435216740127,309.4249527931002, 0, -93.79194193938966,317.1439029555364, 0, -10.678271186410282,322.7256435681537, 0, 64.82345541146658,321.948957384584, 0, 69.41475711676998,269.58743740380316, 0, 71.05051147709406,163.1264743368946, 0, 71.05051147709406,159.53952961773413, 0, 68.13337162416227,159.53952961773413, 0, -4.677615417615058,124.42066238999215, 0, -4.677615417615058,];// 将上面的数组转换成坐标的数组const points = [];for (let i = 0; i < pointArr.length; i += 3) {points.push(new Three.Vector3(pointArr[i], pointArr[i + 1], pointArr[i + 2]));}// 根据所有点,生成一条“不闭合”的曲线const pathCurve = new Three.CatmullRomCurve3(points, false, 'catmullrom', 0);// 根据曲线上的点,生成几何体getPoints的数量越大,几何体越平滑const geometry = new Three.BufferGeometry().setFromPoints(pathCurve.getPoints(10000));// 实例化MeshLineconst meshLine = new MeshLine();meshLine.setGeometry(geometry);// 纹理贴图const arrow = await new Three.TextureLoader().loadAsync(require('@/assets/textures/golden-arrow.png'));arrow.wrapS = Three.RepeatWrapping;arrow.wrapT = Three.RepeatWrapping;// 实例化MeshLine的专属材质const meshLineMaterial = new MeshLineMaterial({useMap: 1,  // 使用贴图map: arrow,color: 0xff00ff,    // 贴图叠加颜色repeat: new Three.Vector2(500, 1),  // 贴图重复数量transparent: true,lineWidth: 10,dashArray: 0.01,    // 一组虚线占总长度的比例side: DoubleSide,});// 解决MeshLine材质顶点着色器报错meshLineMaterial.vertexShader = `bool isPerspectiveMatrix(mat4) {return true;}` + meshLineMaterial.vertexShader;// 实例化渲染出来的网格模型,注意几何体使用MeshLine的几何体 const pathToShow = new Three.Mesh(meshLine.geometry, meshLineMaterial);// 场景的实例化此处不表scene.add(pathToShow);

4. 运行效果运行效果

这篇关于three.meshline包MeshLineMaterial顶点着色器报错 ‘isPerspectiveMatrix‘ : no matching overloaded function found的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

POJ3041 最小顶点覆盖

N*N的矩阵,有些格子有物体,每次消除一行或一列,最少要几次消灭完。 行i - >列j 连边,表示(i,j)处有物体,即 边表示 物体。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impo

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

(function() {})();只执行一次

测试例子: var xx = (function() {     (function() { alert(9) })(); alert(10)     return "yyyy";  })(); 调用: alert(xx); 在调用的时候,你会发现只弹出"yyyy"信息,并不见弹出"10"的信息!这也就是说,这个匿名函数只在立即调用的时候执行一次,这时它已经赋予了给xx变量,也就是只是

js私有作用域(function(){})(); 模仿块级作用域

摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: for(var i=0;i<10;i++){alert(i);}alert(i); for循环后的i,在其它语言像c、java中,会在for结束后被销毁,但js在后续的操作中仍然能访