WEBGL:INVALID_VALUE:vertexAttribPointer:索引超出范围,INVALID_VALUE:enableVertexAttribArray:索引超出范围
WEBGL: INVALID_VALUE: vertexAttribPointer: index out of range, INVALID_VALUE: enableVertexAttribArray: index out of range
我从 .obj 文件读取数据来绘制 model.I 通过使用纹理和顶点正确绘制模型。但是,当我想使用照明进行绘制时,出现错误。
此错误是 WebGL:
INVALID_VALUE: vertexAttribPointer: index out of range, INVALID_VALUE: enableVertexAttribArray: index out of range.
这段代码是我的顶点着色器
var VertexShaderCode = "precision mediump float;\n"+
"attribute vec3 vertexPos;\n" +
"attribute vec3 vertexNormal;\n"+
"uniform mat4 modelViewMatrix;\n" +
"uniform mat4 projectionMatrix;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
" void main(void) {\n" +
" gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); \n" +
" vTextureCoord = aTextureCoord;\n"+
"}\n";
这是我的片段着色器代码
var FragmentShaderCode = "precision lowp float;"+
"uniform vec4 color;"+
"varying vec2 vTextureCoord;"+
"uniform vec3 u_Ambient_color;\n" +
"uniform sampler2D uSampler;"+
"uniform int texturecontrol;"+
"void main() { "+
"vec3 uColor;"+
"uColor = u_Ambient_color * vec3(color);"+
" if(texturecontrol !=0 )"+
" {"+
" gl_FragColor =texture2D(uSampler, vTextureCoord)*vec4(uColor,color.a);"+
" }"+
" else{"+
" gl_FragColor = vec4(uColor,color.a);"+
" }"+
"}"
我试着画成这样。
if(this.Materyals[i].HasTexture){
this.gl.uniform1i(this.FGlobe.PModeltexturecontrol,1)
this.gl.uniform3fv(this.FGlobe.PModelAmbientColorLoc,this.Materyals[i].ambient)
this.gl.uniform4fv(this.FGlobe.PModelColorLoc,this.Materyals[i].color)
this.gl.bindTexture(this.gl.TEXTURE_2D,this.Materyals[i].Texture)
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].textureCoord)
this.gl.vertexAttribPointer(this.FGlobe.PModeltextCoordLoc,2,this.gl.FLOAT,false,0,0) //şu anda this.gl.ARRAY_BUFFER'a geçerli olan tamponun mevcut köşe tamponu nesnesinin genel bir vertex özniteliğine bağlanması ve düzenini belirtir.
this.gl.enableVertexAttribArray(this.FGlobe.PModeltextCoordLoc)
}else{
this.gl.uniform1i(this.FGlobe.PModeltexturecontrol,0)
this.gl.uniform3fv(this.FGlobe.PModelAmbientColorLoc,this.Materyals[i].ambient)
this.gl.uniform4fv(this.FGlobe.PModelColorLoc,this.Materyals[i].color)
this.gl.disableVertexAttribArray(this.FGlobe.PModeltextCoordLoc)
}
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].normalBuffer)
this.gl.vertexAttribPointer(this.FGlobe.PModelnormalPos,3, this.gl.FLOAT, false, 0, 0)
this.gl.enableVertexAttribArray(this.FGlobe.PModelnormalPos)
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].vertexBuffer)
this.gl.vertexAttribPointer(this.FGlobe.PModelvertexPos,3, this.gl.FLOAT, false, 0, 0)
this.gl.enableVertexAttribArray(this.FGlobe.PModelvertexPos)
this.gl.drawArrays(this.gl.TRIANGLES,0, this.Materyals[i].TriCnt*3);
}
有什么想法吗?我该怎么办?
您为 vertexAttribPointer
和 enableVertexAttribArray
指定的属性索引不正确。您没有提供设置这些值的代码,但您应该仔细检查您的代码中没有获取属性和制服位置的拼写错误。
我怀疑这是因为您有一个未使用的属性 vertexNormal。如果在代码中添加一行:
var VertexShaderCode = "precision mediump float;\n"+
"attribute vec3 vertexPos;\n" +
"attribute vec3 vertexNormal;\n"+
"uniform mat4 modelViewMatrix;\n" +
"uniform mat4 projectionMatrix;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
" void main(void) {\n" +
" vertexNormal; \n" + /* This line here */
" gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); \n" +
" vTextureCoord = aTextureCoord;\n"+
"}\n";
事情可能会很好。如果是这种情况,可能是因为 WebGL 优化掉了该属性,因为它没有被使用。
我从 .obj 文件读取数据来绘制 model.I 通过使用纹理和顶点正确绘制模型。但是,当我想使用照明进行绘制时,出现错误。 此错误是 WebGL:
INVALID_VALUE: vertexAttribPointer: index out of range, INVALID_VALUE: enableVertexAttribArray: index out of range.
这段代码是我的顶点着色器
var VertexShaderCode = "precision mediump float;\n"+
"attribute vec3 vertexPos;\n" +
"attribute vec3 vertexNormal;\n"+
"uniform mat4 modelViewMatrix;\n" +
"uniform mat4 projectionMatrix;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
" void main(void) {\n" +
" gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); \n" +
" vTextureCoord = aTextureCoord;\n"+
"}\n";
这是我的片段着色器代码
var FragmentShaderCode = "precision lowp float;"+
"uniform vec4 color;"+
"varying vec2 vTextureCoord;"+
"uniform vec3 u_Ambient_color;\n" +
"uniform sampler2D uSampler;"+
"uniform int texturecontrol;"+
"void main() { "+
"vec3 uColor;"+
"uColor = u_Ambient_color * vec3(color);"+
" if(texturecontrol !=0 )"+
" {"+
" gl_FragColor =texture2D(uSampler, vTextureCoord)*vec4(uColor,color.a);"+
" }"+
" else{"+
" gl_FragColor = vec4(uColor,color.a);"+
" }"+
"}"
我试着画成这样。
if(this.Materyals[i].HasTexture){
this.gl.uniform1i(this.FGlobe.PModeltexturecontrol,1)
this.gl.uniform3fv(this.FGlobe.PModelAmbientColorLoc,this.Materyals[i].ambient)
this.gl.uniform4fv(this.FGlobe.PModelColorLoc,this.Materyals[i].color)
this.gl.bindTexture(this.gl.TEXTURE_2D,this.Materyals[i].Texture)
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].textureCoord)
this.gl.vertexAttribPointer(this.FGlobe.PModeltextCoordLoc,2,this.gl.FLOAT,false,0,0) //şu anda this.gl.ARRAY_BUFFER'a geçerli olan tamponun mevcut köşe tamponu nesnesinin genel bir vertex özniteliğine bağlanması ve düzenini belirtir.
this.gl.enableVertexAttribArray(this.FGlobe.PModeltextCoordLoc)
}else{
this.gl.uniform1i(this.FGlobe.PModeltexturecontrol,0)
this.gl.uniform3fv(this.FGlobe.PModelAmbientColorLoc,this.Materyals[i].ambient)
this.gl.uniform4fv(this.FGlobe.PModelColorLoc,this.Materyals[i].color)
this.gl.disableVertexAttribArray(this.FGlobe.PModeltextCoordLoc)
}
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].normalBuffer)
this.gl.vertexAttribPointer(this.FGlobe.PModelnormalPos,3, this.gl.FLOAT, false, 0, 0)
this.gl.enableVertexAttribArray(this.FGlobe.PModelnormalPos)
this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.Materyals[i].vertexBuffer)
this.gl.vertexAttribPointer(this.FGlobe.PModelvertexPos,3, this.gl.FLOAT, false, 0, 0)
this.gl.enableVertexAttribArray(this.FGlobe.PModelvertexPos)
this.gl.drawArrays(this.gl.TRIANGLES,0, this.Materyals[i].TriCnt*3);
}
有什么想法吗?我该怎么办?
您为 vertexAttribPointer
和 enableVertexAttribArray
指定的属性索引不正确。您没有提供设置这些值的代码,但您应该仔细检查您的代码中没有获取属性和制服位置的拼写错误。
我怀疑这是因为您有一个未使用的属性 vertexNormal。如果在代码中添加一行:
var VertexShaderCode = "precision mediump float;\n"+
"attribute vec3 vertexPos;\n" +
"attribute vec3 vertexNormal;\n"+
"uniform mat4 modelViewMatrix;\n" +
"uniform mat4 projectionMatrix;\n" +
"attribute vec2 aTextureCoord;\n" +
"varying vec2 vTextureCoord;\n" +
" void main(void) {\n" +
" vertexNormal; \n" + /* This line here */
" gl_Position = projectionMatrix * modelViewMatrix * vec4(vertexPos, 1.0); \n" +
" vTextureCoord = aTextureCoord;\n"+
"}\n";
事情可能会很好。如果是这种情况,可能是因为 WebGL 优化掉了该属性,因为它没有被使用。