- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力学习 WebGL,玩得很开心!我决定使用 glTF 作为这个项目的 3d 格式。我让它运行良好,但有一个奇怪的异常(exception)。当索引计数较低时(比如一个简单的三 Angular 立方体),索引计数等于索引缓冲区大小。这不可能是对的。在我拥有的所有其他模型中,索引计数是缓冲区大小的 1/2。
这些会导致像这样的渲染错误“错误:WebGL 警告:drawElements:索引缓冲区太小。”。下面是相关代码。
可渲染构造函数:
constructor(type,indexCount,vertBuffer,indexBuffer,uvBuffer,normalBuffer,modelMatrix){
this.type = type;
this.indexCount = indexCount;
this.name = "NONE";
this.vertBuffer = GL.createBuffer();
GL.bindBuffer(GL.ARRAY_BUFFER, this.vertBuffer);
GL.bufferData(GL.ARRAY_BUFFER, vertBuffer, GL.STATIC_DRAW);
GL.bindBuffer(GL.ARRAY_BUFFER, null);
this.uvBuffer = GL.createBuffer();
GL.bindBuffer(GL.ARRAY_BUFFER, this.uvBuffer);
GL.bufferData(GL.ARRAY_BUFFER, uvBuffer, GL.STATIC_DRAW);
GL.bindBuffer(GL.ARRAY_BUFFER, null);
this.indexBuffer = GL.createBuffer();
GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
GL.bufferData(GL.ELEMENT_ARRAY_BUFFER, indexBuffer, GL.STATIC_DRAW);
GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, null);
this.normalBuffer = GL.createBuffer();
GL.bindBuffer(GL.ARRAY_BUFFER, this.normalBuffer);
GL.bufferData(GL.ARRAY_BUFFER, normalBuffer, GL.STATIC_DRAW);
GL.bindBuffer(GL.ARRAY_BUFFER, null);
this.matrix = modelMatrix;
this.witMatrix = mat4.create();
this.textures = [];
//Create defaults
this.setTexture(new dTexture(TEX.COLOR,"res/missingno.png"));
this.setTexture(new dTexture(TEX.LIGHT,"res/rawLight.png"));
}
GLTF 到“可渲染”
static fromGLTF(type,gltf){
console.log("GLTF: loading "+gltf.nodes[0].name);
return new Renderable(type,
gltf.nodes[0].mesh.primitives[0].indicesLength,
gltf.nodes[0].mesh.primitives[0].attributes.POSITION.bufferView.data,
gltf.accessors[gltf.nodes[0].mesh.primitives[0].indices].bufferView.data,
gltf.nodes[0].mesh.primitives[0].attributes.TEXCOORD_0.bufferView.data,
gltf.nodes[0].mesh.primitives[0].attributes.NORMAL.bufferView.data,
gltf.nodes[0].matrix);
}
这是渲染代码(不是很漂亮,但为了完整起见,就在这里):
render(){
GL.viewport(0.0,0.0,this.canvas.width,this.canvas.height);
GL.clear(GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT);
this.renderables.forEach(renderable => {
//mat4.identity(renderable.witMatrix);
mat4.invert(renderable.witMatrix,renderable.matrix);
mat4.transpose(renderable.witMatrix,renderable.witMatrix);
GL.useProgram(this.programs[renderable.type].program);
GL.uniformMatrix4fv(this.programs[renderable.type].pMatrix, false, this.projectionMatrix);
GL.uniformMatrix4fv(this.programs[renderable.type].vMatrix, false, this.viewMatrix);
GL.uniformMatrix4fv(this.programs[renderable.type].mMatrix, false, renderable.matrix);
GL.enableVertexAttribArray(this.programs[renderable.type].positon);
GL.bindBuffer(GL.ARRAY_BUFFER,renderable.vertBuffer);
GL.vertexAttribPointer(this.programs[renderable.type].positon, 3, GL.FLOAT, false,0,0);
GL.enableVertexAttribArray(this.programs[renderable.type].uv);
GL.bindBuffer(GL.ARRAY_BUFFER,renderable.uvBuffer);
GL.vertexAttribPointer(this.programs[renderable.type].uv, 2, GL.FLOAT, false,0,0);
if(renderable.type == SHADER.STATIC){
GL.uniform1i(this.programs[renderable.type].colorPos, 0); // texture unit 0
GL.activeTexture(GL.TEXTURE0);
GL.bindTexture(GL.TEXTURE_2D, renderable.textures[TEX.COLOR].data);
GL.uniform1i(this.programs[renderable.type].lightPos, 1); // texture unit 1
GL.activeTexture(GL.TEXTURE1);
GL.bindTexture(GL.TEXTURE_2D, renderable.textures[TEX.LIGHT].data);
}else if(renderable.type == SHADER.DYNAMIC){
GL.uniform1i(this.programs[renderable.type].colorPos, 0); // texture unit 0
GL.activeTexture(GL.TEXTURE0);
GL.bindTexture(GL.TEXTURE_2D, renderable.textures[TEX.COLOR].data);
GL.enableVertexAttribArray(this.programs[renderable.type].normalPos);
GL.bindBuffer(GL.ARRAY_BUFFER,renderable.normalBuffer);
GL.vertexAttribPointer(this.programs[renderable.type].normalPos, 3, GL.FLOAT, false,0,0);
GL.uniformMatrix4fv(this.programs[renderable.type].witMatrix, false, renderable.witMatrix);
// set the light position
GL.uniform3fv(this.programs[renderable.type].lightPosPos, [
Math.sin(this.counter)*0.75,
Math.cos(this.counter)*0.75+1,
0
]);
this.counter+=this.dt*0.25;
}
GL.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, renderable.indexBuffer);
GL.drawElements(GL.TRIANGLES,renderable.indexCount,GL.UNSIGNED_SHORT,0);
GL.activeTexture(GL.TEXTURE1);
GL.bindTexture(GL.TEXTURE_2D,this.nullLightmap.data);
});
GL.flush();
}
有什么想法吗?
最佳答案
When the index count is low (say a simple triangulated cube), the index count equals the index buffer size. This can't be right. In every other model I have, the index count is 1/2 the size of the buffer.
索引缓冲区的大小取决于索引的数量和componentType
。
参见 Accessor Element Size :
componentType Size in bytes
5120 (BYTE) 1
5121 (UNSIGNED_BYTE) 1
5122 (SHORT) 2
5123 (UNSIGNED_SHORT) 2
5125 (UNSIGNED_INT) 4
5126 (FLOAT) 4
componentType
指定单个索引的数据类型。当索引数量较少时(<= 256),则使用数据类型UNSIGNED_BYTE
,而索引缓冲区的类型为UNSIGNED_SHORT
甚至UNSIGNED_INT
,如果有更多的索引。如果类型是 UNSIGNED_BYTE
,那么索引的数量当然等于缓冲区的大小(以字节为单位)。
根据元素索引的类型,您必须熟悉绘图调用,例如GL.UNSIGNED_BYTE
:
GL.drawElements(GL.TRIANGLES,renderable.indexCount,GL.UNSIGNED_BYTE,0);
请注意,componentType
(5120, 5121, ...) 的值似乎是任意的,是 OpenGL 枚举器常量 GL.BYTE
的值, GL.UNSIGNED_BYTE
, ...
我建议将 componentType
传递给 constructor
,就像您使用索引数 (indexCount
) 一样
constructor(
type,indexCount,componentType,
vertBuffer,indexBuffer,uvBuffer,normalBuffer,modelMatrix){
this.indexCount = indexCount;
this.componentType = componentType;
并在绘制几何图形时使用它:
GL.drawElements(
GL.TRIANGLES,
renderable.indexCount,
renderable.componentType,
0);
关于javascript - GLTF 索引计数与缓冲区大小错误相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51559473/
我有一个 gltf,它是一组建筑。 我想为每个建筑物添加一些信息,为此,我需要向我的 gltf 模型添加一些属性。 但是,我试着添加这样的东西 { "accessors": [ {
我有一个 gltf,它是一组建筑。 我想为每个建筑物添加一些信息,为此,我需要向我的 gltf 模型添加一些属性。 但是,我试着添加这样的东西 { "accessors": [ {
我之前曾在 gltf 1.0 上工作,现在正尝试更新我的应用程序以呈现 khronos 提供的 gltf2.0 示例模型。我了解着色器 (glsl) 和技术不再是 gltf 2.0 中核心属性的一部分
我正在阅读规范,但我无法理解采样器的属性。 这是我的动画 "animations" : [ { "channels" : [ {
您好,我正在尝试使用 Three.Js 实现 3D 模型查看器,但是我在加载时间方面遇到了问题,我不知道问题出在哪里。 作为一个例子,我试图在这里上传这个模型(下载链接):https://opensp
所以官方文档说: Note that the node transform is the local transform of the node relative to the joint, like
阅读 tinygltf 的源代码,我看到了这个: struct Skin { std::string name; int inverseBindMatrices; // required h
我已经使用网站上的 Collada 转换器将 dae 文件转换为 gltf 文件(我使用的是 Linux,所以我找不到转换前后的调试说明)。当我将模型加载到铯中时,它太暗了。然后我编辑 gltf 文件
我正在努力学习 WebGL,玩得很开心!我决定使用 glTF 作为这个项目的 3d 格式。我让它运行良好,但有一个奇怪的异常(exception)。当索引计数较低时(比如一个简单的三 Angular
我在 Blender (2.79) 中制作了一个非常基本的动画,我正在尝试将其导出为 GLTF 或 GLB。我已经成功安装了 gltf exporter并且能够毫无问题地导出非动画模型的 gltfs
IM 使用三个 js 并尝试从 blender 导入 3d 模型,我还使用 webpack 来处理它。我试图加载一个 glb 文件,但无法让它工作。它现在将文件添加到构建时的 dist 文件夹,但它没
我写了一个关于故障的演示场景来测试我在一个框架中导出的 gltf 模型,但我在控制台中收到一个错误: 我的代码 Basic Scene - A-Frame
我们正在尝试在服务器端合并多个 GLTF,并将合并的 gltf 作为最终结果导出到服务器上。 我们已经证实有效但无效的事情: 我们使用了三个 js GLTFLoader 解析方法来加载多个 gltf
我有一个大 obj 306 mb 的文件.所以我把它转换成 glb文件以减小其大小。文件的大小减少了很多到82 mb ,但还是很大。我想让这个文件更小。有办法吗?如果有,请告诉我。 如果不能减少glb
出于调试目的,我想渲染蒙皮网格的骨架。但是,在 glTF 中,它们似乎以非常抽象的方式定义。也就是说,没有“骨架”,一组由线连接的顶点。换句话说,这没有明确定义: 相反,“骨架”实际上是节点的集合,它
我正在尝试操作 gltf 3D 模型,但我不确定颜色是如何导出的。 baseColorFactor 中介于 0 到 1(或小于 1)之间的所有数字。 这肯定不是RGB也不是RGBA(我把这个页面作为引
我是 THREEJS 的新人。过去,我使用过 AFRAME、CESIUM、XEOGL 和 BABYLONJS。但最终,由于内存消耗和性能,我意识到制作 CAD 可视化工具的最佳产品是 THREEJS。
我正在尝试操作 gltf 3D 模型,但我不确定颜色是如何导出的。 baseColorFactor 中介于 0 到 1(或小于 1)之间的所有数字。 这肯定不是RGB也不是RGBA(我把这个页面作为引
有了这个答案作为引用,我已经成功改变了gltf模型的颜色。 ( Change the color of an object (.dae or gltf) in "AR.JS" ) 但是,模型纹理会消失
我正在测试 a-frame 并尝试加载不是本教程中提供的示例的其他 glTF 文件。我从 Sketchfab 下载了几个 glTF 包文件,但它们似乎无法加载。 如果我使用给定文件链接的 aframe
我是一名优秀的程序员,十分优秀!