【发布时间】:2017-04-14 00:29:44
【问题描述】:
我正在研究使用无绑定纹理来快速显示一系列图像。我的参考资料是 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' - 我的纹理句柄数组或纹理句柄的实际索引?
【问题讨论】: