webgl 中的多个对象

2024-01-17

我正在尝试将一些对象渲染到画布上,但我在理解哪些内容不起作用时遇到了一些困难。

我目前正在构建两个对象,它们代表我想要渲染的两个网格。如果我创建一个网格,代码可以正常工作,所以我认为问题在于,当我构建两个或更多网格时,数据会被搞砸。

这是网格数据的示例:

"name":"cone",
"buffers":{
    "vertexPosition":{}, // Buffer
    "vertexIndex":{} // Buffer
},
"mesh":{
    "vertices":[], // emptied it to fit on page
     "faces":[] // emptied it to fit on page
},
"mvMatrix": Float32Array[16],
"itemSize":3,
"numItems":12,
"program":{
    "vertexPosAttrib":0,
    "mvMatrixUniform":{},
    "pMatrixUniform":{}
}

这是从这个函数构建的:

buildMeshData: function(){

this.mvMatrix = mat4.create();

this.buffers.vertexPosition = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.buffers.vertexPosition);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.mesh.vertices), gl.STATIC_DRAW);

this.buffers.vertexIndex = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.buffers.vertexIndex);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.mesh.faces), gl.STATIC_DRAW);

this.itemSize = 3;
this.numItems = this.mesh.faces.length;

var vertexProps = {

    attributes: ['vec3', 'VertexPosition'],
    uniforms: ['mat4', 'MVMatrix', 'mat4', 'PMatrix'],
    varyings: ['vec3', 'TexCoord']
}
var vertexShaderFunction = 'vTexCoord = aVertexPosition + 0.5; gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1);';
var vshaderInput = utils.buildVertexShader(vertexProps, vertexShaderFunction);

var fragmentProps = {

    attributes: [],
    uniforms: [],
    varyings: ['vec3', 'TexCoord']
}
var fragmentShaderFunction = 'gl_FragColor = vec4(vTexCoord, 1);';
var fshaderInput = utils.buildFragmentShader(fragmentProps, fragmentShaderFunction);

this.program = gl.createProgram();

var vshader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vshader, vshaderInput);
gl.compileShader(vshader);

var fshader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fshader, fshaderInput);
gl.compileShader(fshader);

gl.attachShader(this.program, vshader);
gl.attachShader(this.program, fshader);

gl.linkProgram(this.program);


gl.useProgram(this.program);

this.program.vertexPosAttrib = gl.getAttribLocation(this.program, 'aVertexPosition');
gl.vertexAttribPointer(this.program.vertexPosAttrib, this.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.program.vertexPosAttrib);

this.program.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
this.program.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");

scene.add(this);
}

渲染函数如下所示:

function render(){

currentTime = new Date().getTime();
deltaTime = (currentTime - initialTime) / 1000; // in seconds

gl.viewport(0, 0, stage.width, stage.height);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

for(var i in scene.meshes){

    (function(mesh){

        mat4.translate(mesh.mvMatrix, mesh.mvMatrix, [0, 2 * i, -10 - (10 * i)]);

        gl.useProgram(mesh.program);

        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);

        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, mesh.buffers.vertexIndex);

        gl.vertexAttribPointer(mesh.program.vertexPosAttrib, mesh.itemSize, gl.FLOAT, false, 0, 0);
        gl.enableVertexAttribArray(mesh.program.vertexPosAttrib);

        gl.uniformMatrix4fv(mesh.program.mvMatrixUniform, false, mesh.mvMatrix);
        gl.uniformMatrix4fv(mesh.program.pMatrixUniform, false, scene.pMatrix);

        gl.drawElements(gl.TRIANGLES, mesh.numItems, gl.UNSIGNED_SHORT, 0);

        gl.disableVertexAttribArray(mesh.program.vertexPosAttrib);

    })(scene.meshes[i])

}

// requestAnimationFrame(render);
}

结果是第二个对象被正确绘制,但第一个对象导致错误:

[.WebGLRenderingContext]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0

...因此没有被绘制。

问题出在哪里的任何想法。希望代码中提供了足够的信息,我不想提供太多信息,但如果您需要查看其他内容,我会更新。


这段代码

gl.vertexAttribPointer(this.program.vertexPosAttrib, this.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.program.vertexPosAttrib);

需要在绘制每个网格时调用,而不是现在调用它的地方。另外在打电话之前gl.vertexAttribPointer for this.program.vertexPosAttrib你需要打电话

gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.vertexPosition);

Because gl.vertexAttribPointer绑定当前绑定的缓冲区gl.ARRAY_BUFFER到指定的属性。

换句话说

gl.bindBuffer(gl.ARRAY_BUFFER, mesh.buffers.vertexPosition);
gl.vertexAttribPointer(mesh.program.vertexPosAttrib, mesh.itemSize, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(mesh.program.vertexPosAttrib);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

webgl 中的多个对象 的相关文章

  • 如何确定并打印 jQuery 版本?

    是否有一个 jQuery 函数可以返回当前加载的 jQuery 版本 你可以使用这个 fn jquery or if you re using noConflict jQuery fn jquery 当 jQuery 构建时它会自动更新 定
  • JW Player javaScript API 不工作

    我使用 jwplayer version 5 10 2295 和浏览器 chrome 25 My code jwplayer container setup file path width 300px height 100px autost
  • 如何使用 HTML 5 实现类似 gmail 的文件上传/附件

    我记得一些支持 Ajax 之类的选项 无回发世界 文件上传 隐藏的 iframe 使用 flash 对象 尽管我仍然好奇为什么使用 SWF 以及它提供什么优势 然而 通过查看博客 HTML 5 似乎很有前途 我尝试了一些小示例 它确实有效
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • 如果没有“new”,则无法调用类构造函数

    感谢这个问题已经被问过几次了 但是我遇到的几乎所有情况都是有人试图扩展非本地类的情况 我的情况有所不同 我有一个非常简单的基类 名为CObject如下 export class CObject extends BaseObject cons
  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • 水平滚动的表格上的“粘性”标题......完全不可能?

    经过过去几个小时的研究后 我开始认为这是不可能的 即使在最新的浏览器上也是如此 HTML table具有水平滚动的元素 带有 粘性 thead在顶部 作为垂直滚动的周围网页的一部分 这是我的尝试 a height 100px backgro
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • jQuery输入文件点击方法和IE上拒绝访问

    我尝试仅使用一个按钮作为输入文件 它在 Firefox Chrome Safari 中工作正常 但在 IE 中不行 提交表单时我总是收到 访问被拒绝 的消息 代码 input file click 有真正的解决方法吗 我在谷歌上浪费了大约2
  • API 使用令牌向 odoo 进行身份验证

    我想使用令牌从 Express 应用程序向 Odoo 进行身份验证 我在用odoo xmlrpc https www npmjs com package odoo xmlrpc连接 Odoo 的节点模块 我的快递应用程序 Odoo 要求 A
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 如何在 Web 服务器上设置 gzip 压缩?

    我有一个嵌入式网络服务器 总共有 2 兆空间 通常 您使用 gzip 文件对客户端有利 但这会节省我们在服务器上的空间 我读到你可以只 gzip js 文件并将其保存在服务器上 我在 IIS 上测试过 但没有任何运气 为了使这项工作成功 我
  • 模板中带有 ng-if 的 angularjs 指令

    我正在构建一个在模板内使用 ng if 的指令 奇怪的是 提供给链接函数的元素没有扩展ng if代码 它只是ng if的注释行 经过一番尝试 我发现通过将链接代码包装在 timeout 中似乎可以使其正常工作 但我想知道这是否不是正确的处理
  • 类中可以有生成器 getter 吗?

    我的意思是吸气剂是发电机 我相信这一切都是 ES6 也许像这样 class a get count let i 10 while i yield i let b new a for const i of b count console lo
  • 语法错误:意外的标记“?”在 repl.it 上用 JavaScript 制作不和谐机器人时 [重复]

    这个问题在这里已经有答案了 我收到错误 const token this client token this client accessToken SyntaxError Unexpected token Discord 机器人代码 con
  • 摩纳哥:如何添加内联自动完成/代码建议?

    我找不到任何有关如何添加内联自动完成功能的示例 如下图所示 有人可以指导我如何在摩纳哥做到这一点吗 这可以在 v1 66 中启用 现在在 Insiders 中 The editor quickSuggestions设置现在接受内联为 配置值
  • Chrome 扩展:强制 popup.html 关闭

    我想知道是否可以强制 popup html 关闭 在弹出的 javascript 中 window close
  • MongoDB:javascript执行失败:无法在 src/mongo/shell/collection.js 保存 DBQuery 对象

    在 MongoDb 中 当我尝试修改集合中的现有文档时 它会生成以下异常 javascript execution failed can t save a DBQuery object at src mongo shell collecti

随机推荐

  • 如何为 argparse 中的现有参数添加位置选项

    我正在处理一个 Python 3 x 脚本 由其他人编写 其中输入和输出当前使用标记的可选参数指定 如下所示 parser add argument i input nargs type argparse FileType r defaul
  • 如果我只有类名的字符串,如何从类中调用静态方法?

    我怎样才能让这样的事情发挥作用 class name ClassPeer class name doSomething 取决于 PHP 版本 call user func array class name doSomething call
  • Android SQLite数据库:插入速度慢

    我需要解析一个相当大的 XML 文件 大约一百千字节到几百千字节 我正在使用Xml parse String ContentHandler 我目前正在使用 152KB 文件对此进行测试 在解析过程中 我还使用类似于以下的调用将数据插入 SQ
  • Magento 自定义模块如何在 config.xml 中存储变量

    我有一个工作正常的自定义模块 但我希望能够在配置中存储变量 以便我可以在代码中使用它们 例如默认错误消息 我想我可以通过使用 Mage getStoreConfig some path here 来访问它们但我不知道如何将它们添加到模块 c
  • 将 CString 转换为字符串 (VC6)

    我想将 CString 转换为字符串 是的 我知道我在做什么 我知道如果 CString 值范围超出 ANSI 返回的字符串将不正确 但没关系 以下代码在VC2008下可以运行 std string Utils CString2String
  • 是否有可以包含资源的受支持文件类型列表?

    我正在寻找可以包含资源并可以通过以下方式加载的文件类型列表LoadLibrary http msdn microsoft com en us library windows desktop ms684175 28v vs 85 29 asp
  • python内置列表的__init__方法下面的初始化过程是什么

    我的问题是init列表类的方法调用其他方法 例如append或insert 来实现其功能 like class test list def init self values super init def append self value
  • 具有 Circe 实现的通用 json 解码器特征 [重复]

    这个问题在这里已经有答案了 我有一个用于将 json 解码器注入为项目组件依赖项的特征 trait JsonDecoder def apply T s String Option T 当我尝试用它来实现它时Circe https circe
  • 从 Xerces 获取架构数据类型

    我在 Xerces C 中使用 SAX2 并且希望在处理元素时获取 XML 架构数据 以便了解架构中定义的类型 我怎样才能做到这一点 好吧 我知道该怎么做了 关于该主题的可用文档很少 显然 我需要将 XMLReaderFactory cre
  • Rust - 调用内部值方法的枚举方法

    我有一个如下的枚举 enum Foo A X B Y C Z 其中 X Y 和 Z 是实现该方法的结构体bar 我希望能够定义一个方法bar on the Fooenum 以便调用其内部值对应的方法 现在我有这个 impl Foo pub
  • 在 extjs 中扩展电子邮件验证

    我在 ExtJs 6 0 1 250 版本中内置了以下用户注册表单 我有一个接受电子邮件字段 co com直到四个字 我需要处理最近的事情tlds并想要覆盖电子邮件验证逻辑 我尝试过validator并应用正则表达式但是regexText不
  • 更改 TableView 上 UISearchBars 的宽度

    我需要在我的 tableView 中创建两个 UISearchBar 我希望它们在桌子顶部的宽度相等 并排 我创建了两个 UISearchBar 出口 并为它们创建了属性和分配 我发现很难将它们都放置 我的意思是适合 视图中 我只看到一个搜
  • 如何跳过“按回车键启动合并解析工具”并自动打开mergetool

    Git 要求按返回按钮一一打开每个冲突文件的合并工具 gt git mergetool Normal merge conflict for local modified file remote modified file Hit retur
  • Linux下无root权限如何获取CPU序列号

    在没有root权限的Linux Ubuntu 下如何获取CPU序列号 我尝试了 cpuid 命令 它无需 root 权限即可工作 但似乎返回全零 我相信是因为需要在 BIOS 中更改某些内容 您能否建议我另一种从程序中检索 CPU 序列号的
  • 如何向 Google 表单添加登录信息以供用户填写

    我一直在网上阅读和观看许多教程 但我找不到可以最初使用单个输入文本加载某种对话框或登录页面的内容 这样我就可以使用应用程序脚本对其进行处理 onFormOpen 不会在完成表单的用户上触发 在我的 onSubmitForm 函数中 我有以下
  • 处理 Pylab 导入错误未定义符号

    我已经成功安装并从我的主目录调用 matplotlib myname sysimm51 python Python 2 7 6 default Nov 11 2013 13 13 15 GCC 4 4 7 20120313 Red Hat
  • 如何在 libcurl 中禁用 Expect 100 continue

    我正在使用 CURLOPT POST 发送 https 消息 在运行过程中 我的应用程序停留在 期望 100 继续 完成等待 100 继续 From 乔治的日志 当curl发送100 继续时 https gms tf when curl s
  • 如何在 Swift 中将字符串(数字)转换为 Int 数组

    我想知道如何在 Swift 中将 String 转换为 Int 数组 在Java中我总是这样做 String myString 123456789 int myArray new int myString lenght for int i
  • 无法在 Google Chrome 中获取 JSON 文件? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Chrome 中使用本地文件的 jQuery getJSON 问题 https stackoverflow com questions 2541949 problems with jquery g
  • webgl 中的多个对象

    我正在尝试将一些对象渲染到画布上 但我在理解哪些内容不起作用时遇到了一些困难 我目前正在构建两个对象 它们代表我想要渲染的两个网格 如果我创建一个网格 代码可以正常工作 所以我认为问题在于 当我构建两个或更多网格时 数据会被搞砸 这是网格数