WebGL GL ERREUR :GL_INVALID_OPERATION : glDrawElements: tentative d'accès à la hors de portée des sommets dans l'attribut 1
Je suis d'essayer de fixer un pré-existants bug dans le code qui est basé sur THREE.js rev 49 avec quelques shaders.
Je suis un total de WebGL newb, donc je n'ai pas été en mesure de faire beaucoup de têtes ou queues d'autres réponses car il semble qu'ils assument beaucoup plus de connaissances que j'ai eu. Je serais super reconnaissante de même des indications sur ce qu'il faut chercher! 🙂 Le résultat final de ce code est de dessiner une boîte translucide fil de fer et de peindre les visages translucide textures.
L'erreur est:
[.WebGLRenderingContext]GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 1
J'ai tracé la question à un particulier _gl.drawElements( _gl.TRIANGLES, geometryGroup.__webglFaceCount, _gl.UNSIGNED_SHORT, 0 );
dans TROIS.WebGLRenderer.renderBuffer.
Ici est un extrait de l'appel de code:
scene.overrideMaterial = depthMaterial; //shaders below
var ctx = renderer.getContext(); //renderer is a THREE.WebGLRenderer
ctx.disable(ctx.BLEND);
//renderTarget is a THREE.WebGLRenderTarget, _camera, scene is obvious
renderer.render(scene, _camera, renderTarget, true); //error occurs here
Voici les shaders:
uniforms: {},
vertexShader: [
"varying vec3 vNormal;",
"void main() {",
"vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );",
"vNormal = normalMatrix * normal;",
"gl_Position = projectionMatrix * mvPosition;",
"}"
].join("\n"),
fragmentShader: [
"vec4 pack_depth( const in highp float depth ) {",
"const highp vec4 bit_shift = vec4( 256.0, 256.0*256.0, 256.0*256.0*256.0, 256.0*256.0*256.0*256.0 );",
"vec4 res = depth * bit_shift;",
"res.x = min(res.x + 1.0, 255.0);",
"res = fract(floor(res) /256.0);",
"return res;",
"}",
"void main() {",
"gl_FragData[0] = pack_depth( gl_FragCoord.z );",
"}"
].join("\n")
Merci pour votre aide!
OriginalL'auteur SapphireSun | 2014-01-18
Vous devez vous connecter pour publier un commentaire.
En WebGL, vous réglez les tampons complète de données, généralement les positions des sommets, les normales, les couleurs, les coordonnées de texture. Vous demandez ensuite de WebGL pour en tirer quelque chose avec les tampons. Vous pouvez demander avec
gl.drawArrays
ou avecgl.drawElements
.gl.drawElements
utilise un autre tampon plein d'indices pour décider quels sommets à utiliser.L'erreur vous avez les moyens de vous demandé de WebGL pour dessiner ou d'accès plus d'éléments que les tampons de votre installation. En d'autres termes, si vous fournissez seulement 3 sommets de données, mais vous lui demander de dessiner des 4 sommets lorsque vous appelez
gl.drawArrays
vous obtiendrez cette erreur. De même, si vous ne fournissez 3 sommets de données, mais le programme d'installation indices que l'accès tout sommet de plus de 2, vous obtiendrez cette erreur. Vous avez 3 sommets numérotés de #0, #1 et #2 de sorte que si l'un de vos indices sont supérieurs à 2 vous demandez WebGL pour accéder à quelque chose en dehors de la plage des 3 sommets que vous avez fournis.Donc, vérifiez vos données. Êtes-vous d'indices hors de portée? Est un de vos tampons plus court que les autres? etc..
OriginalL'auteur gman
Je suis en ajoutant ce pour la perfection - j'ai été en utilisant un importés OBJ modèle et a été l'obtention de cette erreur lors de la création du shader par le biais de TROIS.ShaderLib["normalmap"]
Le correctif a été tout simplement appeler computeTangents() sur le maillage de la géométrie de l'objet:
modèle.la géométrie.computeTangents();
archivés la réponse ici
j'ai créé une sphère: var géométrie = new TROIS.SphereGeometry(10,128,128); et eu cette erreur en essayant de applu les normales/déplacement shader. vos conseils m'ont aidé!
pour l'enregistrement, la computeTangents méthode a été supprimé.
OriginalL'auteur neoRiley