gpt4 book ai didi

OpenGL 无绑定(bind)纹理 : Bind to uniform sampler2D array

转载 作者:行者123 更新时间:2023-12-04 19:41:23 25 4
gpt4 key购买 nike

我正在研究使用无绑定(bind)纹理来快速显示一系列图像。我的引用资料是 OpenGL 4.5 红皮书。这本书说我可以使用这个片段着色器在着色器中对无绑定(bind)纹理进行采样:

#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();
}

我的问题是如何将我的纹理句柄绑定(bind)到片段着色器的 ALL_TEXTURES 统一属性?另外,我应该使用什么来更新顶点属性 'texindex' - 我的纹理句柄数组或纹理句柄的实际索引?

最佳答案

这是 无绑定(bind) 纹理。您不会将此类纹理“绑定(bind)”到任何东西。

bindless texturing ,采样器的数据值是一个数字。具体来说,glGetTextureHandleARB 返回的数字。纹理句柄是 64 位无符号整数。

在着色器中,sampler 的值类型为buffer-backed interface blocks (UBO 和 SSBO)是 64 位无符号整数。所以一个采样器数组在结构上等同于一个 64 位无符号整数数组。

因此,在 C++ 中,与您的 ALL_TEXTURES block 等效的结构将是:

struct AllTextures
{
GLuint64 textures[200];
};

好吧,当然,假设您正确使用 std140 布局。否则,您必须查询结构的布局。

此时,您将缓冲区视为与任何其他 UBO 用法没有区别。通过将 AllTextures 粘贴到缓冲区对象中为着色器构建数据,然后将该缓冲区作为 UBO 绑定(bind)到绑定(bind) 0。您只需使用实际纹理句柄填充数组。

Also, what should I use to update the vertex attribute 'texindex' - an actual index into my texture handle array or a texture handle?

好吧,谁都行不通。不是你写的那样。

见,ARB_bindless_texture不允许您随时从任何着色器调用以任何方式访问您想要的任何纹理。除非您使用的是 NV_gpu_shader5,否则导致纹理访问的代码必须基于 dynamically uniform expressions .

因此,除非您的渲染命令中的每个顶点都获得相同的索引或句柄...您不能使用它们来选择要使用的纹理。即使是实例化也不会拯救你,因为动态统一的表达式并不关心实例化。

如果您想渲染一堆四边形而不必更改它们之间的制服(并且不必依赖 NVIDIA 扩展),那么您有几个选择。大多数支持无绑定(bind)纹理的硬件也支持ARB_shader_draw_parameters .这使您可以访问 gl_DrawID,它表示渲染命令的当前索引 within a glMultiDraw-style command .并且该扩展明确声明 gl_DrawID 是动态统一的。

因此您可以使用它来选择要渲染的纹理。您只需要发出一个多重绘制命令,在其中一遍又一遍地渲染相同的网格数据,但在每种情况下它会获得不同的 gl_DrawID 索引。

关于OpenGL 无绑定(bind)纹理 : Bind to uniform sampler2D array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com