OpenGL标准是否要求对texture2d操作的结果给出一个统一的sampler2D,程序没有绑定到纹理单元?
例如在像素着色器中:
layout(binding=0) uniform sampler2D Map_Diffuse;
...
texture2D(Map_Diffuse, attrib_Fragment_Texture)
计划中的位置:
::glActiveTexture(GL_TEXTURE0);
::glBindTexture(GL_TEXTURE_2D, 0);
对于上下文,我想知道我是否可以对纹理和非纹理实体使用相同的着色器,其中(希望)我只需要确保没有任何内容绑定到GL_TEXTURE_2D以使texture2d()返回0,0 ,0,1。否则我每个排列都需要一个着色器。
答案 0 :(得分:2)
我阅读规范的方式,保证返回黑色。以下引号是从3.3规范中复制的。
在第2.11.7节"着色器执行"在"顶点着色器",第81页:
如果采样器的相关纹理不完整,则在顶点或几何着色器中使用采样器将返回(R,G,B,A)=(0,0,0,1),如3.8.14节中所定义。
等同于第3.9.2节"着色器执行"在" Fragment Shaders",第188页:
如果采样器的相关纹理不完整,则在片段着色器中使用采样器将返回(R,G,B,A)=(0,0,0,1),如3.8.14节所述。
在第3.8.14节"纹理完整性"中,它说:
如果一致地定义了利用纹理进行纹理应用所需的所有图像数组和纹理参数,则称纹理是完整的。
现在,它并没有明确说出任何甚至不存在的纹理对象。但是,由于不引用纹理对象(包括0)的纹理名称肯定没有"所有的图像数组和纹理参数一致定义",我认为它们属于"不完整"在上面的定义中。
答案 1 :(得分:1)
OpenGL标准是否规定了texture2d的结果 操作应该给出程序没有的统一采样器2D 绑定到纹理单元?
当纹理采样器未绑定到纹理对象时,它默认绑定到纹理对象0/null
,这在C / C ++中类似于null。访问对象null
时,根据我的经验,您将获得零值,例如:
vec2 Data = texture(unboundSampler, textureCoords);
Data
通常是zoroes,但我的假设是依赖于此实现,某些驱动程序可能会崩溃。
对于上下文,我想知道我是否可以使用相同的着色器 纹理和非纹理实体
在我的引擎中,我通过创建一个4个白色像素的默认白色纹理来解决这个问题。初始化引擎时由代码生成。当我想使用具有纹理采样器的着色器并且相应的材质没有纹理时,我指定默认的白色纹理。这样我可以重用相同的着色器。如果您非常关心性能,可能需要使用没有纹理的着色器来处理非纹理对象。
standard doesn't talk about the implementation但它鼓励您将零对象视为非功能对象。 https://www.opengl.org/wiki/OpenGL_Object#Object_zero