我正在研究使用无绑定纹理来快速显示一系列图像。我参考的是OpenGL 4.5红皮书。该书称我可以使用以下片段着色器在着色器中对无绑定纹理进行采样:
#version 450 core
#extension GL_ARB_bindless_texture : require
in FS_INPUTS {
vec2 i_texcoord;
flat int i_texindex;
};
layout (binding = 0) uniform ALL_TEXTURES {
sampler2D fs_textures[200];
};
out vec4 color;
void main(void) {
color = texture(fs_textures[i_texindex], i_texcoord);
};
我创建了一个顶点着色器,代码如下:
#version 450 core
in vec2 vert;
in vec2 texcoord;
uniform int texindex;
out FS_INPUTS {
vec2 i_texcoord;
flat int i_texindex;
} tex_data;
void main(void) {
tex_data.i_texcoord = texcoord;
tex_data.i_texindex = texindex;
gl_Position = vec4(vert.x, vert.y, 0.0, 1.0);
};
你可能会注意到,我对发生的事情并不是很清楚。
在我的OpenGL代码中,我创建了一堆纹理,获取它们的句柄,并使它们常驻内存。我使用的函数来获取纹理句柄是 'glGetTextureHandleARB'。还有另一个可以代替它的函数 'glGetTextureSamplerHandleARB',我可以传递一个采样器位置进去。这是我所做的:
Texture* textures = new Texture[load_limit];
GLuint64* tex_handles = new GLuint64[load_limit];
for (int i=0; i<load_limit; ++i)
{
textures[i].bind();
textures[i].data(new CvImageFile(image_names[i]));
tex_handles[i] = glGetTextureHandleARB(textures[i].id());
glMakeTextureHandleResidentARB(tex_handles[i]);
textures[i].unbind();
}
我的问题是如何将纹理句柄绑定到片段着色器的ALL_TEXTURES统一属性?另外,我应该使用什么来更新顶点属性“texindex”——实际上是一个纹理句柄数组中的索引还是纹理句柄本身?