纯 WebGL 虚线

2024-01-11

我正在尝试使用纯 webgl 创建一条虚线。我知道已经有一个问题了,也许我很蠢,但我不知道如何让它发挥作用。我理解这个概念,但我不知道如何获取着色器中沿路径的距离。之前的答案有以下一行:

varying float LengthSoFar; // <-- passed in from the vertex shader

那么我怎样才能得到LengthSoFar?如何在顶点着色器中计算它?

我完全错过了什么吗?有人能给我一个有效的例子吗?或者至少有一些好的线索?这几天我一直在用头撞墙。


我假设它是这样工作的。你有一个仓位缓冲区。你做了一个相应的缓冲区lengthSoFar so,

function distance(array, ndx1, ndx2) 
{
  ndx1 *= 3;
  ndx2 *= 3;

  var dx = array[ndx1 + 0] - array[ndx2 + 0];
  var dy = array[ndx1 + 1] - array[ndx2 + 1];
  var dz = array[ndx1 + 2] - array[ndx2 + 2];

  return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

var positions = 
[
  0.123, 0.010, 0.233,
  0.423, 0.312, 0.344,
  0.933, 1.332, 0.101,
];

var lengthSoFar = [0];  // the length so far starts at 0
for (var ii = 1; ii < positions.length / 3; ++ii) 
{
  lengthSoFar.push(lengthSoFar[ii - 1] + distance(positions, ii - 1, ii));
}

现在您可以为两者创建缓冲区positions and lengthSoFar并通过lengthSoFar作为顶点着色器的属性,然后将其作为变量传递给片段着色器。

不幸的是,它不适用于索引几何图形(最常见的类型?)。换句话说,它不能与gl.drawElements, 只有gl.drawArrays。此外,虚线将以 3D 而非 2D 形式绘制,因此进入屏幕(远离观看者)的线看起来与穿过屏幕的线不同。当然,如果你画2D那就没问题了。

如果这些限制对您有好处,这是否回答了您的问题?

const gl = document.querySelector("#c").getContext("webgl");

// Note: createProgramFromScripts will call bindAttribLocation
// based on the index of the attibute names we pass to it.
var program = twgl.createProgramFromScripts(
    gl, 
    ["vshader", "fshader"], 
    ["a_position", "a_lengthSoFar"]);
gl.useProgram(program);

function distance(array, ndx1, ndx2) 
{
  ndx1 *= 3;
  ndx2 *= 3;

  var dx = array[ndx1 + 0] - array[ndx2 + 0];
  var dy = array[ndx1 + 1] - array[ndx2 + 1];
  var dz = array[ndx1 + 2] - array[ndx2 + 2];

  return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

// Used this line in the console to generate the positions
// var sub = 10; for (var ii = 0; ii <= sub; ++ii) { r = (ii & 1) ? 0.5 : 0.9; a = ii * Math.PI * 2 / sub; console.log((Math.cos(a) * r).toFixed(3) + ", " + (Math.sin(a) * r).toFixed(3) + ", "); }

var positions = [
  0.900, 0.000, 0,
  0.405, 0.294, 0,
  0.278, 0.856, 0,
  -0.155, 0.476, 0,
  -0.728, 0.529, 0,
  -0.500, 0.000, 0,
  -0.728, -0.529, 0,
  -0.155, -0.476, 0,
  0.278, -0.856, 0,
  0.405, -0.294, 0,
  0.900, -0.000, 0,
];
    
var lengthSoFar = [0];  // the length so far starts at 0
for (var ii = 1; ii < positions.length / 3; ++ii) 
{
  lengthSoFar.push(lengthSoFar[ii - 1] + distance(positions, ii - 1, ii));
}

var vertBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);

var vertBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(lengthSoFar), gl.STATIC_DRAW);
gl.enableVertexAttribArray(1);
gl.vertexAttribPointer(1, 1, gl.FLOAT, false, 0, 0);

// Since uniforms default to '0' and since 
// the default active texture is '0' we don't
// have to setup the texture uniform. 
var pixels = [
    0, 0, 255, 255,
    0, 0, 255, 255,
    0, 0, 255, 255,
    0, 0, 255, 255,
    0, 0, 0, 0,
    0, 0, 0, 0,
    255, 0, 0, 255,
    0, 0, 0, 0,
    0, 0, 0, 0,
    255, 0, 0, 255,
    0, 0, 0, 0,
    0, 0, 0, 0,
];

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(
    gl.TEXTURE_2D, 0, gl.RGBA, pixels.length / 4, 1, 0,
    gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(pixels));
gl.texParameteri(
    gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(
    gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);

gl.drawArrays(gl.LINE_STRIP, 0, positions.length / 3);
canvas { border: 1px solid black; }
<script src="https://twgljs.org/dist/4.x/twgl-full.min.js"></script>
<script id="vshader" type="whatever">
    attribute vec4 a_position;
    attribute float a_lengthSoFar;
    varying float v_lengthSoFar;
    void main() {
      gl_Position = a_position;
      v_lengthSoFar = a_lengthSoFar;
    }    
</script>
<script id="fshader" type="whatever">
precision mediump float;
varying float v_lengthSoFar;
uniform sampler2D u_pattern;
#define NumDashes 6.0
void main() {
    gl_FragColor = texture2D(
      u_pattern, 
      vec2(fract(v_lengthSoFar * NumDashes)), 0.5);
}
</script>
<canvas id="c" width="300" height="300"></canvas>

Note: 这是一篇可能有助于解释变量如何工作的文章 http://games.greggman.com/game/webgl-how-it-works/

另请注意,您无法更改线条的粗细。为此,您需要从三角形画线 https://mattdesl.svbtle.com/drawing-lines-is-hard

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

纯 WebGL 虚线 的相关文章

  • 在使用 jQuery 拖动时向元素添加 CSS 类

    是否可以在元素被拖动到特定区域时向其添加 CSS 类 并在元素被删除后替换该类 我并不是到处寻找这个功能 而是只在特定区域寻找这个功能 是的 这当然有可能 jQuery UI 提供了一些方便的选项和事件来执行此操作 对于初学者来说 可拖动元
  • Redux 状态在窗口重新加载时重置(客户端)

    我有非常大且复杂的对象 例如 userInfo chatInfo 等 就像具有非常大且嵌套信息的对象和数组一样 每次刷新页面时 我的 React 应用程序都会重置 redux 状态 我必须再次调用所有这些 API 我对这个主题做了一些研究
  • javascript函数知道它的名字吗

    我有一个名为 getItem 的函数 我想使用其中的代码读取该函数的名称 这可能吗 function getItem var functionName how do I read the function name alert functi
  • 重新排序 Magento JavaScript 包含 (addJs)

    我会保持简单 在我的产品页面上 我需要删除prototype js 文件并将其替换为最新版本的prototype 到目前为止 我已经使用 local xml 成功替换了它
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 如何在React-Native中选择ListView的一项?

    我是 React Native 的新手 我想使用 ListView 选择一项 当我第一次按下 item 时 ListView renderRow 被调用 但终究不起作用 我该如何修复这个错误 我的问题出在哪里 我写了一个演示here htt
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • 为什么我的箭头函数有原型属性?

    正如文档中提到的https developer mozilla org en docs Web JavaScript Reference Functions Arrow functions https developer mozilla o
  • 如何使用 console.log 省略文件/行号

    如今 您可以在 Chrome 的控制台中编写非常好的东西 查看this https developer chrome com devtools docs tips and tricks关联 我也做了一个截图 正如您在屏幕截图中看到的那样 文
  • 我什么时候应该使用内联和外部 Javascript?

    我想知道什么时候应该包含外部脚本或将它们与 html 代码内联编写 就性能和易于维护而言 这方面的一般做法是什么 真实场景 我有几个需要客户端表单验证的 html 页面 为此 我使用了一个包含在所有这些页面上的 jQuery 插件 但问题是
  • 标记内的值发生变化时调用函数

    JavaScript 有没有什么方法可以在段落标记的值更改时调用函数 概述 HTML p 00 00 p
  • 使用 jQuery 更改 SVG 元素的“xlink:href”属性

    我正在尝试使用单击事件更改 xlink href 属性 到目前为止它部分有效 这就是我正在做的 HTML a href class ui btn ui corner all ui shadow editIcon style text ali
  • 如何在 Next.js 中正确使用 Mongoose 模型?

    我正在使用 TypeScript 和 MongoDB Mongoose 构建 Next js 应用程序 我在使用 Mongoose 模型时开始遇到错误 这导致它们在每次使用模型时都尝试覆盖模型 导致模型覆盖错误的代码 import mong
  • D3 时间解析返回 null

    根据此页面上的说明 https github com mbostock d3 wiki Time Formatting https github com mbostock d3 wiki Time Formatting我正在尝试解析 ISO
  • 用于图形操作的 Javascript 库

    有没有建议的 javascript 替代 pythonpygraph http code google com p python graph or NetworkX http networkx lanl gov 应该注意的是 可视化不是必需
  • Bootstrap 3 - 模态背景不会根据模态对话框的高度调整大小?

    我将一个表单放入模式中 并尝试在用户触发单选按钮时显示表单的一些隐藏字段 显示隐藏字段后 模态自动重新缩放的高度 但模态背景的高度不能用作模态对话框 我该如何解决它 div class modal fade div class modal
  • Modernizr 未将类应用于 html 标签

    我目前正在构建一个网站 我需要使用 Modernizr 但由于某种原因 它没有将类应用到 html 标签 因为它应该 我的代码如下所示
  • 自动更改 Twitter Bootstrap 选项卡

    我希望 Twitter Bootstrap 选项卡按时间顺序更改 我使用它们有点像旋转木马 我希望选项卡每 10 秒切换到下一个选项卡 这是一个例子 http library buffalo edu http library buffalo
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1
  • 使用 Three.js 中的设备方向控件进行对象旋转

    我正在迈出使用 JavaScript 进行编码并使用 Three js 的第一步 我正在尝试 Threejs org 的这个例子 http trijs org examples misc controls deviceorientation

随机推荐

  • Adobe Acrobat Pro XI - 将 Javascript 添加到 PDF

    这似乎是一个非常新手的问题 但我一整天都在为这个问题绞尽脑汁 我正在运行 Adob e Acrobat Professional XI 的试用版 我希望将简单的 JavaScript 添加到 PDF 文件中 目的是创建一个 PDF 文件 打
  • 帮助比较 argv 字符串

    I have int main int argc char argv if argc 2 printf Mode of Use copy ex1 n return 1 formatDisk argv void formatDisk char
  • MVC 中的验证规则和业务规则

    我有一个 MVC Web 项目 根据最佳实践 添加验证规则和业务规则的正确位置在哪里 验证规则将是必填字段和必填格式 商业规则将是 该电子邮件已被存入数据库 这是我目前正在做的注册模型 public class RegisterModel
  • 基于 BGL 的新类中的自定义函数 addEdge 的返回值应该是多少?

    我尝试实现一个基于的图形类https stackoverflow com a 950173 7558038 https stackoverflow com a 950173 7558038 添加边缘时 我返回所添加边缘的边缘描述符 但如果边
  • Android:检查互联网是否有可用网络

    我使用此代码来检查网络连接 public boolean isOnline ConnectivityManager cm ConnectivityManager getSystemService Context CONNECTIVITY S
  • 使用 Pycurl 获取 HTML

    我一直在尝试使用 pycurl 检索 HTML 页面 因此我可以使用 str split 和一些 for 循环解析它以获取相关信息 我知道 Pycurl 检索 HTML 因为它将它打印到终端 但是 如果我尝试做类似的事情 html str
  • 简单配置时收到 Wix 安装程序错误代码 2343。 (WIX新手)

    使用以下简单的 WIX 配置时 我收到以下错误 正在安装的应用程序是 WPF 产品 Web Miner 安装程序 安装程序在安装此软件包时遇到意外错误 这可能表明此包有问题 错误代码为 2343 参数为
  • Spark应用程序状态中的FAILED和ERROR有什么区别

    我正在尝试创建已提交的 Spark 应用程序的状态图 当应用程序被视为失败时 我有点迷失了 各州来自这里 https github com apache spark blob d6dc12ef0146ae409834c78737c11605
  • 如何在sql中进行join时保持顺序

    表1和表2的主键 key1 key2 相同 表 3 是用户定义的表 具有与表 2 相同的一列字段 5 我需要从表 1 和表 2 中选择行 其中表 2 中的 field5 位于表 3 中 我需要以与 table3 相同的顺序获取行 table
  • 停留在显示 PHP 分页器上

    我正在尝试创建一个分页器 我创建了一个分页器类 其属性如下所示 但现在我正在尝试显示分页器 但我完全陷入了不同的循环 也许我应该去睡觉 P 之类的东西 重要的属性是 windows size the amount of pages visi
  • 如何使用 CSS 类选择第一个、第二个或第三个 html 元素内的子元素?

    我想在 CSS 中选择锚标记 出于以下 html 文档的目的 我也做了同样的事情 我的 html 文档在这里 div class first div
  • 用于扫描仪颜色意图的 WIA 自动化不起作用

    我无法让我的 Canon Pixma MP150 从 C 代码进行彩色扫描 以下代码会生成黑白图像 或者如果我将 6146 的值更改为 2 则会创建灰度图像 我希望能够通过代码进行彩色扫描 我知道扫描仪可以处理彩色图像 因为我可以通过 扫描
  • 当我在 PHP 中使用 cURL 发布文件时,是否应该设置 CURLOPT_UPLOAD?

    当我尝试设置它时 它会强制请求方法被 PUT 这是我在 CURLOPT POSTFIELDS 中放入的内容 curl setopt ch CURLOPT POSTFIELDS array fileUpload gt home apache
  • Visual Studio:如何将 obj 文件夹保存在其他位置

    有谁知道如何告诉 VS 2008 在构建解决方案时保存 obj 文件夹的位置 我们让它将 bin 文件夹保存到另一个路径 以保持源文件文件夹较小 即可通过电子邮件发送 但找不到任何方法告诉它对 obj 执行相同的操作 Use the Bas
  • 编辑选定列表视图项目的项目或子项目值

    好的 所以我在一个表单上有一个列表视图 当按下按钮时 它会打开一个新表单 其中包含所选列表视图项目的内容及其一系列文本框中的子项目 然后 用户可以更改文本框中的数据 然后按 保存 进行更改或按 取消 关闭窗口 我将使用什么命令将选定的列表视
  • 发送短信导致一般失败

    我使用一种非常常见的方式通过我的应用程序发送短信 几乎所有教程中都对此进行了解释 我将 sendMultipartTextMessage 与 发送意图 和 传递意图 一起使用 然后广播接收器侦听结果并打印内容 但是 每次我尝试发送短信时 即
  • 为什么需要 lambda 来嵌套 defaultdict?

    我有点困惑为什么你需要一个 lambda 函数来嵌套 defaultdict 为什么你不能这样做呢 test defaultdict defaultdict list 代替 test defaultdict lambda defaultdi
  • “完全二叉树”、“严格二叉树”、“满二叉树”之间的区别?

    我对以下树的术语感到困惑 我一直在研究树 但无法区分这些树 a 完全二叉树 b 严格二叉树 c 完整二叉树 请帮我区分这些树 这些树何时何地在数据结构中使用 完美的树 x x x x x x x x x x x x x x x 完整的树 x
  • 如何使文本在节点中居中?

    我正在学习关于d3 js和力量体系 我有一个拦截器 因为我无法添加文本 并且它完全位于圆圈的中心 我曾尝试创建
  • 纯 WebGL 虚线

    我正在尝试使用纯 webgl 创建一条虚线 我知道已经有一个问题了 也许我很蠢 但我不知道如何让它发挥作用 我理解这个概念 但我不知道如何获取着色器中沿路径的距离 之前的答案有以下一行 varying float LengthSoFar l