Opengl es OpenGL ES 2.x:在同一个纹理图像单元中绑定'GL_TEXTURE_2D'和'GL_TEXTURE_CUBE_MAP'?

Opengl es OpenGL ES 2.x:在同一个纹理图像单元中绑定'GL_TEXTURE_2D'和'GL_TEXTURE_CUBE_MAP'?,opengl-es,opengl-es-2.0,Opengl Es,Opengl Es 2.0,如果将(不同的纹理)绑定到同一纹理图像单元中的GL\u TEXTURE\u 2D和GL\u TEXTURE\u CUBE\u MAP,会发生什么情况 例如,假设我将一个纹理绑定到GL\u TEXTURE0的GL\u texture\u 2D目标,将另一个纹理绑定到同一纹理单元的GL\u texture\u CUBE\u MAP目标。然后我可以有两个统一的变量,一个是asampler2D,另一个是asamplerCube,并将两者都设置为0(参考glu TEXTURE0) 我怀疑答案是“否”(或者

如果将(不同的纹理)绑定到同一纹理图像单元中的
GL\u TEXTURE\u 2D
GL\u TEXTURE\u CUBE\u MAP
,会发生什么情况

例如,假设我将一个纹理绑定到
GL\u TEXTURE0
GL\u texture\u 2D
目标,将另一个纹理绑定到同一纹理单元的
GL\u texture\u CUBE\u MAP
目标。然后我可以有两个统一的变量,一个是a
sampler2D
,另一个是a
samplerCube
,并将两者都设置为0(参考
glu TEXTURE0


我怀疑答案是“否”(或者结果未定义),但我在规范中没有发现任何明确禁止在同一纹理图像单元中使用多个纹理目标的内容。

我没有发现任何内容说明是否可以在同一纹理单元中绑定2D纹理和立方体贴图纹理,但是(大约)我想这是完全可能的。允许这样做是有意义的,因为所有纹理修改函数都要求您指定要操作的纹理目标

但OpenGL ES 2规范明确禁止在着色器中同时使用这两种类型,如第2.10章所述:

不允许有不同采样器类型的变量 指向程序对象内的同一纹理图像单元。这 只能在发出下一个渲染命令时检测到情况, 然后将生成无效的_操作错误


因此,您不能同时使用引用同一纹理单元的
sampler2D
samplerCube
来弯曲实现的纹理单元限制。

对于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