OpenGL的sampler对象的有关问题
OpenGL的sampler对象的问题
我在写一个GLES的浅wrapper。突然发现不知道应当怎么包装sampler了。(我是指glGenSamplers、glBindSampler的那个sampler)
1:我回翻自己2011年写的课程作业,发现那时候完全没用glGenSamplers、glBindSampler、glSamplerParameterXXX这几个API,程序也很正常。那为什么我们还需要宿主端sampler这一大套设施?它提供了什么灵活性?
2:glBindSampler(GLuint unit, GLuint sampler)的文档里说,第一个参数是“the texture unit to which the sampler is bound”。那我应当传“XX”还是“GL_TEXTURE_UNIT_XX”?
而且按理讲,glActiveTexture会设定当前的texture unit,为啥glBindSampler还要额外提供一个texture unit的参数?
3:glSamplerParameterX和glTexParameterX有很多key是一样的,比如比较模式、缩放过滤方式等等。那这两个API有什么区别?
------解决思路----------------------
glSamplerParameterX和glTexParameterX有很多key是一样的,比如比较模式、缩放过滤方式等等。那这两个API有什么区别?
答:当没有采样器对象绑定到对应的采样器单元时,每个用来从纹理中读取的纹理对象都有默认的采样器对象。为了修改对象参数也提供了类似的glTexParameter()函数;
这是编程指南书中的原话。刚好看到这一章,顺手一贴。对于其他问题也表示围观
------解决思路----------------------
跟着书本google了一波,梳理下理解(ps::不保证100%正确)
首先这里有个例子:http://orangepalantir.org/topicspace/show/84 看了大概会知道sampler该如何包装。
然后对于texture unit,也是引用了OpenGL编程指南的原话:unit 是基于0的无符号整数,允许OpenGL实现支持任意数目的采样器单元而不用OpenGL保留标志。 可以理解为任意的无符号整数,0,1,2.......并不表示纹理单元,与glActiveTexture( GL_TEXTURE0..GLTEXTUREi)的参数意义是完全不同的。那问题来了,该如何关联起来让着色器通过sampler查询纹理数据呢?1、需要在着色器中定义内置采样器类型:samplerBuffer,sample2D.... 修饰的整形变量。texture unit 的值就对应于这个变量的值,这个值需要在应用程序c++代码中通过glUniformi()赋值,着色器中根据这个值具体类型采用不同类型的内置函数查询纹理数据,并在采样过程中应用比较模式,缩放过滤模式之类的,而对于同一纹理数据源,使用不同设置的sampler可以达到不同的采样结果,这也许是非默认sampler的好处之一,简洁明了。
我在写一个GLES的浅wrapper。突然发现不知道应当怎么包装sampler了。(我是指glGenSamplers、glBindSampler的那个sampler)
1:我回翻自己2011年写的课程作业,发现那时候完全没用glGenSamplers、glBindSampler、glSamplerParameterXXX这几个API,程序也很正常。那为什么我们还需要宿主端sampler这一大套设施?它提供了什么灵活性?
2:glBindSampler(GLuint unit, GLuint sampler)的文档里说,第一个参数是“the texture unit to which the sampler is bound”。那我应当传“XX”还是“GL_TEXTURE_UNIT_XX”?
而且按理讲,glActiveTexture会设定当前的texture unit,为啥glBindSampler还要额外提供一个texture unit的参数?
3:glSamplerParameterX和glTexParameterX有很多key是一样的,比如比较模式、缩放过滤方式等等。那这两个API有什么区别?
------解决思路----------------------
glSamplerParameterX和glTexParameterX有很多key是一样的,比如比较模式、缩放过滤方式等等。那这两个API有什么区别?
答:当没有采样器对象绑定到对应的采样器单元时,每个用来从纹理中读取的纹理对象都有默认的采样器对象。为了修改对象参数也提供了类似的glTexParameter()函数;
这是编程指南书中的原话。刚好看到这一章,顺手一贴。对于其他问题也表示围观
------解决思路----------------------
跟着书本google了一波,梳理下理解(ps::不保证100%正确)
首先这里有个例子:http://orangepalantir.org/topicspace/show/84 看了大概会知道sampler该如何包装。
然后对于texture unit,也是引用了OpenGL编程指南的原话:unit 是基于0的无符号整数,允许OpenGL实现支持任意数目的采样器单元而不用OpenGL保留标志。 可以理解为任意的无符号整数,0,1,2.......并不表示纹理单元,与glActiveTexture( GL_TEXTURE0..GLTEXTUREi)的参数意义是完全不同的。那问题来了,该如何关联起来让着色器通过sampler查询纹理数据呢?1、需要在着色器中定义内置采样器类型:samplerBuffer,sample2D.... 修饰的整形变量。texture unit 的值就对应于这个变量的值,这个值需要在应用程序c++代码中通过glUniformi()赋值,着色器中根据这个值具体类型采用不同类型的内置函数查询纹理数据,并在采样过程中应用比较模式,缩放过滤模式之类的,而对于同一纹理数据源,使用不同设置的sampler可以达到不同的采样结果,这也许是非默认sampler的好处之一,简洁明了。