javascript – 重用几何导致间歇性THREE.JS纹理错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 重用几何导致间歇性THREE.JS纹理错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5298字,纯文字阅读大概需要8分钟。
内容图文
我正在使用THREE.js为Firefox和Chrome创建我的第一个游戏(纸牌游戏),目前我遇到了间歇性错误,这使得我的一些纹理看不见.
这篇文章的目的是了解为什么会这样,所以我可以解决问题.我将在帖子的最后添加我的问题.
当我在加载场景之前切换浏览器选项卡时,它会以更高的频率发生.
我已经检查了我的代码以验证我是否在场景中已经加载了网格设置新材料,但事实并非如此.
我正在使用带有箔卡的高光贴图,我试图在Stack Overflow中找到相关解决方案.我还尝试删除镜面反射贴图.
我还阅读了关于在对象在场景中之后添加的材质的设置更新标志,并且它也不起作用.
我也研究了类似的帖子,但这两个总结了我必须尝试解决问题的选项.
错误:
256 [.WebGLRenderingContext]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0
WebGL: too many errors, no more errors will be reported to the console for this context.
卡对象创建步骤:
1 – 在游戏负载上创建基础几何体
2 – 重新使用所有正在创建的卡片
基础几何体创建(顶点/面部操作是使用vertexColors为边框创建黑色 – 灰黑色渐变:THREE.VertexColors):
(function createGeometry () {
DBZCCG.Card.backTexture = THREE.ImageUtils.loadTexture(
"images/DBZCCG/back.jpg");
DBZCCG.Card.cubeGeo =
new THREE.CubeGeometry(
DBZCCG.Card.cardWidth,
DBZCCG.Card.cardHeight,
DBZCCG.Card.cardDepth
);
/* Vertex and face alterations */
var cube = DBZCCG.Card.cubeGeo;
var vertices = cube.vertices;
var faces = cube.faces;
vertices.push(vertices[7].clone());
vertices.push(vertices[5].clone());
vertices.push(vertices[0].clone());
vertices.push(vertices[2].clone());
vertices[5].color = vertices[0].color = vertices[2].color = vertices[7].color
= new THREE.Color(0x777777);
vertices[5].z = vertices[0].z = vertices[2].z = vertices[7].z = 0;
faces[8].a = 9;
faces[8].b = 8;
faces[8].c = 10;
faces[9].a = 8;
faces[9].b = 11;
faces[9].c = 10;
faces.push(new THREE.Face3(9, 5, 7));
faces.push(new THREE.Face3(9, 7, 8));
faces.push(new THREE.Face3(0, 10, 2));
faces.push(new THREE.Face3(10, 11, 2));
faces.push(new THREE.Face3(8, 7, 2));
faces.push(new THREE.Face3(8, 2, 11));
faces.push(new THREE.Face3(5, 9, 0));
faces.push(new THREE.Face3(0, 9, 10));
for (var i = 0; i < faces.length; i++) {
if (vertices[faces[i].a].color === undefined) {
faces[i].vertexColors[0] = new THREE.Color(0x000000);
} else {
faces[i].vertexColors[0] = vertices[faces[i].a].color;
}
if (vertices[faces[i].b].color === undefined) {
faces[i].vertexColors[1] = new THREE.Color(0x000000);
} else {
faces[i].vertexColors[1] = vertices[faces[i].b].color;
}
if (vertices[faces[i].c].color === undefined) {
faces[i].vertexColors[2] = new THREE.Color(0x000000);
} else {
faces[i].vertexColors[2] = vertices[faces[i].c].color;
}
}
})();
这是创建卡的功能:
function createCard(texturePath) {
var card = new THREE.Object3D();
DBZCCG.loadCounter++;
var frontTexture = texturePath ?
THREE.ImageUtils.loadTexture(texturePath,
THREE.UVMapping,
DBZCCG.incrementLoad)
: null;
DBZCCG.loadCounter++;
var specularMap =
THREE.ImageUtils.loadTexture(
'images/DBZCCG/saiyan/specularmap.jpg',
THREE.UVMapping, DBZCCG.incrementLoad);
var cardCoverBackMaterials = [];
for (var i = 0; i < 4; i++) {
cardCoverBackMaterials.push(new THREE.MeshBasicMaterial(
{
transparent: true,
emissive: 0xFFFFFF,
vertexColors: THREE.VertexColors
})); // sides
}
cardCoverBackMaterials[4] = new THREE.MeshBasicMaterial(
{
transparent: true,
emissive: 0xFFFFFF,
map: DBZCCG.Card.backTexture
}); // back
cardCoverBackMaterials[5] = new THREE.MeshBasicMaterial(
{
transparent: true,
reflectivity: dataObject.foil ?
dataObject.foil.reflectivity : 1,
specularMap: specularMap,
envMap: dataObject.foil ? dataObject.foil.texture : null,
emissive: 0xFFFFFF,
map: frontTexture
}); // front
for (var i = 0; i < 4; i++) {
cardCoverBackMaterials.push(
new THREE.MeshBasicMaterial({
transparent: true,
emissive: 0xFFFFFF
})); // sides
}
var cube = new THREE.Mesh(
DBZCCG.Card.cubeGeo,
new THREE.MeshFaceMaterial(cardCoverBackMaterials));
card.add(cube);
return card;
}
问题:
1 – 我有什么办法可以解决这个问题吗?
2 – 这是否与在将对象添加到场景之前渲染的场景相关?
3 – 这是否与纹理加载前渲染的场景有关?
4 – 对于Q2和Q3,我尝试使用窗口间隔添加负载检查.我仍然不时得到错误.
5 – 是否有选项可以捕获webgl错误并再次呈现所有内容?这是一个不错的选择吗?
TL / DR;我的代码在加载时发生了间歇性的WebGL错误.我正在使用THREE.js.
谢谢
THREE.js r66
编辑:
我正在添加两个屏幕截图,一个带有错误,一个带有一切正常.
One reload later, everything is normal
解决后编辑:
基本上我对场景中的所有卡片对象使用相同的几何体.
我改变了:
var cube = new THREE.Mesh(DBZCCG.Card.cubeGeo,
new THREE.MeshFaceMaterial(cardCoverBackMaterials));
成:
var cube = new THREE.Mesh(DBZCCG.Card.cubeGeo.clone(),
new THREE.MeshFaceMaterial(cardCoverBackMaterials));
难道我不能重复使用相同的几何体?
我仍然不明白为什么它会让错误消失,我想解释为什么它解决了这个错误(也许也就是为什么它也会导致错误).
当我制作一个50行代码试图重现错误时,我正在重用几何体并且错误从未发生过.我也使用相同的函数来创建生成问题的对象.
解决方法:
我会尝试使用onLoad事件的回调来控制代码的时间和执行.例如改变
DBZCCG.Card.backTexture = THREE.ImageUtils.loadTexture(
"images/DBZCCG/back.jpg");
至
DBZCCG.Card.backTexture = THREE.ImageUtils.loadTexture(
"images/DBZCCG/back.jpg", new THREE.UVMapping(), function() { ... } );
使用回调函数确保在进行之前完成加载.
嘿抱歉延迟我没有登录堆栈.我认为这里的问题是你试图将多个纹理应用于相同的几何体.我认为他们应该相互怀疑,但我猜不是.克隆几何体允许将每个纹理应用于它自己的对象.或者至少那是我对事物的看法.
内容总结
以上是互联网集市为您收集整理的javascript – 重用几何导致间歇性THREE.JS纹理错误全部内容,希望文章能够帮你解决javascript – 重用几何导致间歇性THREE.JS纹理错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。