纯 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 虚线 的相关文章

  • JavaScript onTouch 不工作

    谁能告诉我为什么这个 onTouch 处理程序没有触发 var myDiv document getElementById existingContent var myButton a href log out a myDiv append
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • 使用 vscode 调试器调试 next.js

    我已经使用安装了一个项目创建下一个应用程序 https github com segmentio create next app 我需要使用我的编辑器 vscode 调试服务器端渲染 所以我访问过vscode recipes 如何调试 ne
  • 主干视图 DOM 元素已删除

    我一直在阅读有关 Backbone js 僵尸 或内存泄漏 问题的信息 基本上 当您不再需要该元素时 您必须从 DOM 中解除绑定并删除该元素 以确保所有事件也被删除 现在 我有一个包含几个容器的单页应用程序 div div div div
  • jquery.find() 可以只选择直接子项吗?

    我应该向 jQuery find 提供什么参数来选择元素子元素而不选择其他元素 我不能用 gt 引导选择器 而用 将选择所有后代 而不仅仅是直接子代 我知道 jQuery children 但这是一个库 因此用户能够提供自己的选择器 并且我
  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 如何抑制窗口鼠标滚轮滚动...?

    我正在开发嵌入页面中的画布应用程序 我有它 因此您可以使用鼠标滚轮放大绘图 但不幸的是 这会滚动页面 因为它是文章的一部分 当我在 dom 元素上滚动鼠标滚轮时 是否可以阻止鼠标滚轮在窗口上滚动 附加鼠标滚轮 不是 Gecko DOMMou
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 如何使用tampermonkey模拟react应用程序中的点击?

    我正在尝试使用 Tampermonkey 脚本模拟对 React 元素的点击 不幸的是 由于 React 有自己的影子 DOM 所以天真的方法使用document querySelector 不工作 我遇到了一些需要修改 React 组件本
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • 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