Webgl 铬合金中不同纹理类型的纹理单元重复使用

Webgl 铬合金中不同纹理类型的纹理单元重复使用,webgl,Webgl,检查以下测试: 这是对立方体纹理的简单测试。它也有一个二维纹理在那里很好的措施 我发现,在一些浏览器中(到目前为止,是chrome),如果我重复使用与2D纹理相同的纹理单元来绘制立方体纹理,图像将无法正确显示 底部有一个复选框,标记为“为球体上的立方体纹理和地板上的2D纹理使用单独的纹理单元”,显示了这一点 这是chrome中的错误还是我的代码中的错误?我已经订购了一些绘图函数的代码,现在正在运行 正方形: TexturedSquare.prototype.draw = function()

检查以下测试:

这是对立方体纹理的简单测试。它也有一个二维纹理在那里很好的措施

我发现,在一些浏览器中(到目前为止,是chrome),如果我重复使用与2D纹理相同的纹理单元来绘制立方体纹理,图像将无法正确显示

底部有一个复选框,标记为“为球体上的立方体纹理和地板上的2D纹理使用单独的纹理单元”,显示了这一点


这是chrome中的错误还是我的代码中的错误?

我已经订购了一些绘图函数的代码,现在正在运行

正方形:

TexturedSquare.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.v);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(gl.va_tex1pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,10*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,10*4,4*4);
    gl.vertexAttribPointer(gl.va_tex1pos,2,gl.FLOAT,false,10*4,4*8);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,this.texture);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,null);

    gl.uniform1i(shader.textures,1);
    gl.uniform1i(shader.texture1,0);
    gl.uniform1i(shader.cube_textures,0);
    gl.uniform1i(shader.cubeTexture0,1);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.e);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_tex1pos);
}
球体:

GLHTexturedSphere.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.vbuf);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(this.va_cubetex0pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,8*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,8*4,4*4);
    gl.vertexAttribPointer(this.va_cubetex0pos,4,gl.FLOAT,false,8*4,4*4);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,null);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,this.texture);

    gl.uniform1i(shader.textures,0);
    gl.uniform1i(shader.texture1,1);
    gl.uniform1i(shader.cube_textures,1);
    gl.uniform1i(shader.cubeTexture0,0);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.ebuf);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_cubetex0pos);
}
他们现在都在使用
TEXTURE0
。请检查WebGL状态和统一值


原版代码对我来说有点难,对不起。但我认为问题在于
texture1
cubeTexture0
制服设置了相同的值。

我已经订购了一些绘图函数的代码,现在正在工作

正方形:

TexturedSquare.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.v);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(gl.va_tex1pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,10*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,10*4,4*4);
    gl.vertexAttribPointer(gl.va_tex1pos,2,gl.FLOAT,false,10*4,4*8);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,this.texture);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,null);

    gl.uniform1i(shader.textures,1);
    gl.uniform1i(shader.texture1,0);
    gl.uniform1i(shader.cube_textures,0);
    gl.uniform1i(shader.cubeTexture0,1);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.e);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_tex1pos);
}
球体:

GLHTexturedSphere.prototype.draw = function() {
    gl.bindBuffer(gl.ARRAY_BUFFER,this.vbuf);
    gl.enableVertexAttribArray(gl.va_vertex);
    gl.enableVertexAttribArray(gl.va_normal);
    gl.enableVertexAttribArray(this.va_cubetex0pos);
    gl.vertexAttribPointer(gl.va_vertex,4,gl.FLOAT,false,8*4,0);
    gl.vertexAttribPointer(gl.va_normal,4,gl.FLOAT,false,8*4,4*4);
    gl.vertexAttribPointer(this.va_cubetex0pos,4,gl.FLOAT,false,8*4,4*4);

    gl.activeTexture(gl.TEXTURE0);
    gl.bindTexture(gl.TEXTURE_2D,null);
    gl.bindTexture(gl.TEXTURE_CUBE_MAP,this.texture);

    gl.uniform1i(shader.textures,0);
    gl.uniform1i(shader.texture1,1);
    gl.uniform1i(shader.cube_textures,1);
    gl.uniform1i(shader.cubeTexture0,0);

    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,this.ebuf);
    gl.drawElements(gl.TRIANGLES,this.l,gl.UNSIGNED_SHORT,0);

    gl.disableVertexAttribArray(gl.va_cubetex0pos);
}
他们现在都在使用
TEXTURE0
。请检查WebGL状态和统一值


原版代码对我来说有点难,对不起。但我认为问题在于
texture1
cubeTexture0
制服的设置值相同。

我看不出你的代码有什么问题,但是

1) 不能对两个不同的目标使用相同的纹理。换句话说,你不能这么做

tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
2) 不能同时在纹理单元上使用纹理2D和立方体贴图

可以同时指定两者,但渲染时,仅允许在着色器中引用其中一个。换句话说

gl.activeTexture(gl.TEXTURE0);
tex1 = gl.createTexture();
tex2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex1);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex2);

可以,但尝试使用纹理单元0中的两种纹理的着色器将失败。

我看不出您的代码有任何错误,但是

1) 不能对两个不同的目标使用相同的纹理。换句话说,你不能这么做

tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
2) 不能同时在纹理单元上使用纹理2D和立方体贴图

可以同时指定两者,但渲染时,仅允许在着色器中引用其中一个。换句话说

gl.activeTexture(gl.TEXTURE0);
tex1 = gl.createTexture();
tex2 = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex1);
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex2);
可以,但尝试使用纹理单元0中的两个纹理的着色器将失败