如果在同一纹理图像单元中将(不同纹理)绑定到GL_TEXTURE_2D
和GL_TEXTURE_CUBE_MAP
会发生什么?
例如,假设我将一个纹理绑定到GL_TEXTURE0
的{{1}}目标,将另一个纹理绑定到同一个纹理单元的GL_TEXTURE_2D
目标。那么我可以有两个统一变量,一个是GL_TEXTURE_CUBE_MAP
而另一个是sampler2D
,并且都设置为0(以引用samplerCube
)?
我怀疑答案是“不”(或结果未定义)但我没有在规范中发现任何明确禁止在同一纹理图像单元中使用多个纹理目标的内容。
答案 0 :(得分:8)
我没有找到任何描述你是否可以在同一纹理单元中绑定2D纹理和立方体贴图纹理的东西,但是(或者 so )我想这是完全可能的。允许它是有意义的,因为所有纹理修改函数都要求您指定要操作的纹理目标。
但OpenGL ES 2规范明确禁止在着色器中同时使用两者,如第2.10章所述:
不允许使用不同采样器类型的变量 指向程序对象中的相同纹理图像单元。这个 情况只能在下一个渲染的渲染命令中检测到, 然后会生成INVALID_OPERATION错误。
因此,您不能同时使用sampler2D
和samplerCube
引用相同的纹理单元来弯曲实现的纹理单元限制。
答案 1 :(得分:1)
对于Chrome,尝试执行此类操作时出现错误。
var gl = document.getElementById("canv00").getContext("webgl");
const texture = gl.createTexture()
gl.bindTexture(gl.TEXTURE_2D, texture)
gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture)
gl.getParameter(gl.TEXTURE_BINDING_2D) // texture
gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP) // null
gl.getError() // returns 1282 error
var gl = document.getElementById("canv00").getContext("webgl");
const texture = gl.createTexture()
gl.bindTexture(gl.TEXTURE_2D, texture)
// gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture)
gl.getParameter(gl.TEXTURE_BINDING_2D) // texture
gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP) // null
gl.getError() // no error
var gl = document.getElementById("canv00").getContext("webgl");
const texture = gl.createTexture()
// gl.bindTexture(gl.TEXTURE_2D, texture)
gl.bindTexture(gl.TEXTURE_CUBE_MAP, texture)
gl.getParameter(gl.TEXTURE_BINDING_2D) // null
gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP) // texture
gl.getError() // no error