2015-02-09 61 views
3

OpenGL标准是否规定应该给纹理2d操作的结果提供一个统一的sampler2D,程序没有绑定到纹理单元?从未绑定的纹理单元读取OpenGL

例如在像素着色器:

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

[在OpenGL中绑定零纹理](http://stackoverflow.com/questions/15273674/binding-a-zero-texture-in-opengl) – Bahbar 2015-02-09 15:59:41

+0

是的。感谢那。回答了我的问题! – Robinson 2015-02-09 16:15:28

回答

2

我阅读规范的方式,它保证返回黑色。以下引号是从3.3规范复制的。

在根据 “顶点着色器” 部分2.11.7 “着色器执行”,81页:

在顶点或几何着色器使用采样器将返回(R,G,B,A)= (0,0,0,1),如果采样器的相关纹理不完整,如3.8.14节所定义。

和等同于下 “片段着色器” 部分3.9.2 “着色器执行”,188页上:

在片段着色器使用采样器将返回(R,G,B,A )=(0,0,0,1)如果采样器的关联纹理不完整,如3.8.14节定义。

在第3.8.14“纹理完整性”,它说:

纹理被认为是完整的,如果需要利用纹理应用纹理所有的图像阵列和纹理参数的一致性德网络定义。

现在,它没有明确地说出任何关于甚至不存在的纹理对象。但是因为没有引用纹理对象(包括0)的纹理名称当然没有“所有图像数组和纹理参数一致定义”,所以我认为它们属于上面定义中的“不完整”。

+0

谢谢Reto。 – Robinson 2015-02-10 10:42:30

1

是否OpenGL标准的任务是什么一个Texture2D 操作的结果应该给一个统一的sampler2D,该方案还没有 绑定到纹理单元?

当纹理采样器未绑定到纹理对象时,它默认绑定到纹理对象0/null,这在C/C++中是空的。当访问对象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

+0

这是一个好主意,但如果他们尝试做某些他们不应该做的事情,我通常更喜欢事情崩溃。我讨厌它,因为驱动程序和库对错误的输入有影响。他们不会给程序员任何好处。你懂我的意思吗?我仍然想知道标准是否说明了这一点。 – Robinson 2015-02-09 15:16:05

+0

@Robinson编辑答案澄清。 – concept3d 2015-02-09 17:19:45