OpenGL Bindless 纹理:绑定到统一的sampler2D 数组

2024-01-08

我正在研究使用无绑定纹理来快速显示一系列图像。我的参考是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” - 我的纹理句柄数组或纹理句柄的实际索引?


It's bindless纹理化。您不会将此类纹理“绑定”到任何东西。

In 无约束纹理 https://www.opengl.org/wiki/Bindless_Texture,采样器的数据值是一个数字。具体来说,返回的数字glGetTextureHandleARB。纹理句柄是 64 位无符号整数。

在着色器中,值sampler输入缓冲区支持的接口块 https://www.opengl.org/wiki/Interface_Block_(GLSL)#Buffer_backed(UBO 和 SSBO)是 64 位无符号整数。因此采样器数组在结构上相当于 64 位无符号整数数组。

所以在 C++ 中,一个结构相当于你的ALL_TEXTURES块将是:

struct AllTextures
{
    GLuint64 textures[200];
};

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

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

另外,我应该使用什么来更新顶点属性“texindex” - 我的纹理句柄数组或纹理句柄的实际索引?

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

See, ARB_bindless_texture https://www.opengl.org/registry/specs/ARB/bindless_texture.txt不允许您在任何时间从任何着色器调用中以任何方式访问您想要的任何纹理。除非您使用 NV_gpu_shader5,否则导致纹理访问的代码必须基于动态统一表达式 https://www.opengl.org/wiki/Dynamically_Uniform_Expression.

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

如果您想要渲染一堆四边形而无需更改它们之间的制服(并且无需依赖 NVIDIA 扩展),那么您有几种选择。大多数支持无绑定纹理的硬件也支持ARB_shader_draw_parameters https://www.opengl.org/registry/specs/ARB/shader_draw_parameters.txt。这使您可以访问gl_DrawID,表示渲染命令的当前索引在一个glMultiDraw-风格命令 https://www.opengl.org/wiki/Vertex_Rendering#Multi-Draw。该扩展明确声明gl_DrawID是动态均匀的。

所以你可以用它来选择要渲染的纹理。您只需要发出多次绘制命令,一遍又一遍地渲染相同的网格数据,但它会得到不同的结果gl_DrawID每种情况下的索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL Bindless 纹理:绑定到统一的sampler2D 数组 的相关文章

  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 有没有好的 GLSL 哈希函数?

    所以我对这个问题的古老评论仍然得到了支持 GLSL rand 这一行代码的起源是什么 https stackoverflow com questions 12964279 whats the origin of this glsl rand
  • OpenGL,如何独立旋转对象?

    到目前为止我的代码 void display void glClear GL COLOR BUFFER BIT GL DEPTH BUFFER BIT Clear Screen And Depth Buffer glLoadIdentity
  • 纹理的内部格式

    看下面的OpenGL函数 void glTexImage2D GLenum target GLint level GLint internalFormat GLsizei width GLsizei height GLint border
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • OpenGL 使用着色器将 NV12 转换为 RGB24

    我尝试编写一个应用程序来在 OpenGL 中显示 YUV 图像 我使用此代码片段在 C 中成功将 Y UV 转换为 RGB source https blog csdn net subfate article details 4730514
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 渲染具有透明度的纹理时,OpenGL 不需要的像素

    我已经为这个问题苦苦挣扎了一段时间了 当我使用 OpenGL 渲染 2D 纹理 在无透明度和部分透明度之间的过渡上具有透明度值 时 我得到了一些烦人的灰色像素 我认为这是像素值插值的产物 关于如何改进这一点有什么想法吗 I m attach
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 为什么我的 CAOpenGLLayer 更新速度比之前的 NSOpenGLView 慢?

    我有一个在 Mac OS X 上渲染 OpenGL 内容的应用程序 最初它渲染到 NSOpenGLView 然后我将其更改为渲染到 CAOpenGLLayer 子类 当我这样做时 我看到了巨大的性能损失 帧速率减半 鼠标响应能力降低 卡顿
  • 渲染缓冲区大于窗口大小 - OpenGL

    我正在尝试绘制大于屏幕尺寸 即 320x480 的渲染缓冲区 512x512 执行 glReadPixels 后 图像看起来是正确的 除非图像的尺寸超过了屏幕尺寸 在本例中 超过了水平 320 和垂直 480 是什么原因导致这种异常现象呢
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 创建并使用我自己的纹理图集的 mipmap

    我目前正在使用自动 mipmap 生成 C OpenTK GL GenerateMipmap GenerateMipmapTarget Texture2D 我使用的纹理平铺为 16px 的块 所以我的问题是 是否可以使用不会缩小至 1x1
  • 如何在多采样纹理上渲染帧缓冲区对象?

    我目前有一个使用多个通道的渲染引擎 其中图像的各个部分在纹理上渲染 然后使用着色器进行组合 它有效 现在我想激活多重采样 我在这里读到 http www opengl org wiki Framebuffer Object Examples
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错
  • 在着色器中旋转法线

    我有一个场景 其中有多个具有各自位置和旋转的模型 给定法线 着色器对每个像素应用简单的双向照明 那是我的顶点着色器 version 150 in vec3 position in vec3 normal in vec2 texcoord o
  • 如何在片段着色器中将 gl_FragCoord 转换为世界空间点?

    我的理解是 如果您有视图投影矩阵 屏幕宽度和屏幕高度的逆矩阵 则可以将 gl FragCoord 转换为片段着色器中世界坐标中的点 首先 你转换gl FragCoord x and gl FragCoord y通过分别除以宽度和高度 然后将

随机推荐

  • SQL*Plus 脚本执行两次

    我正在尝试使用 sqlplus 运行脚本 我的脚本是一个简单的删除语句 我通过将以下内容放入 ksh 终端来执行它 sqlplus username password sql delete societes sql sql delete s
  • AttributeError:“模块”对象没有属性“请求”

    当我在 Python 3 3 中运行以下代码时 import urllib tempfile urllib request urlopen http yahoo com 我收到以下错误 我也这样做来验证 我究竟做错了什么 The urlli
  • 如何在 Unity 协程中通过引用局部变量?

    我有一些函数可以接受 Enemy 实例并更改其字段之一 敌人类别有一些基本字段 如速度 伤害 攻击范围 每个函数只存储敌人的一个正常值 然后将当前字段更改为某个值一段时间 然后将其更改回正常状态 我在 Unity 中编写代码并使用 Coro
  • 无法在anaconda上安装tensorflow

    我正在尝试在 anaconda 上安装tensorflow i tried conda install c conda forge tensorflow 但安装卡住了Solving environment 寻找解决方案 因此有人建议使用调试
  • 使用回车键提交输入字段

    我正在构建天气应用程序 并希望使用 Enter 键将城市名称提交到服务器 我收到错误 提交不是一个函数 我想解决这个问题 并且想知道如何将值发送到 Express 服务器 以便在 API 调用中使用它 这是我的代码
  • 如何将 Beyond Compare 与 ClearCase 集成?

    我想将 Beyond Compare 与 ClearCase 集成 这样我就可以用它来比较和合并文件 而不是 ClearCase 提供的那些糟糕的工具 有人有执行此集成的说明吗 正如我的文章中提到的之前的回答 https stackover
  • 用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个关于约定的问题 下面的两组命令返回相同的结果 a 1 2 3 a first gt 1 a 0 gt 1 a last gt 3 a 1
  • 我可以在 Android 上获得英语以外语言的语音识别吗?

    我正在尝试构建一个应用程序 将使用印地语和其他区域语言 来获取语音命令 我的应用程序中还需要文本转语音功能 我想知道是否有什么方法可以在 Android 上获得语音识别库 我在 Google 上进行了快速搜索 并在互联网上找到了几个印地语库
  • 无法 ssh 到 AWS EC2:身份文件无法访问[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • HTML 输入字段禁用输入但仍然 POST

    基本上我想要一个禁用文本字段来显示存储在数据库中的值 但我不希望用户可以编辑它 我尝试过使用disabled disabled 但随后它不再发布到我的表单处理程序 有什么建议么 thanks docu http www w3 org TR
  • 构建一台 LISP 机器需要多少原语?十个、七个还是五个?

    在这个网站上 他们说有 10 个 LISP 原语 原语是 atom quote eq car cdr cons cond lambda label apply http hyperpolyglot wikidot com lisp ten
  • 用于运行检测显示器的 Applescript

    当我将外接显示器插入 Macbook 并唤醒它时 显示器的分辨率通常是错误的 在使用 Mountain Lion 之前 我能够运行以下 applescript 来检测显示器 tell application System Preferenc
  • 给定 y 值获取 x 值:线性/非线性插值函数的一般求根

    我对插值函数的一般求根问题感兴趣 假设我有以下内容 x y data set seed 0 x lt 1 10 runif 10 0 1 0 1 y lt rnorm 10 3 1 以及线性插值和三次样条插值 f1 lt approxfun
  • 基于Memcache的消息队列?

    我正在开发一款多人游戏 它需要一个消息队列 即消息输入 消息输出 没有重复或删除的消息 假设没有意外的缓存驱逐 以下是我所知道的基于内存缓存的队列 内存缓存问 http memcachedb org memcacheq http memca
  • Prolog:寻找所有解决方案

    标题可能看起来像是一毛钱一打 但事实并非如此 该计划的目的是学习这些课程 需要 needs ece2090 1 m 13 16 ece3520 1 tu 11 14 ece4420 1 w 13 16 并将他们与有资格教授课程并且在此期间也
  • 哪些编程语言可以生成自包含的 Windows .exe?

    我想要制作一个易于部署的 Windows 应用程序 并且想知道哪些编程系统可以创建完全独立的 Windows exe 文件 另外 如果可以使用同一来源的 MacOSX 和 Linux 来完成同样的事情 这将是一个额外的好处 我查看了 Rea
  • 错误:类模板部分特化包含无法推导的模板参数

    我非常感谢您帮助弄清楚我的代码中出现的这个问题 我已将其简化为以下内容 typedef unsigned short ushort template
  • 为什么没有更多的 Java 代码使用 PipedInputStream / PipedOutputStream?

    我最近发现了这个成语 我想知道我是否遗漏了一些东西 我从未见过它被使用过 我在野外使用过的几乎所有 Java 代码都倾向于将数据放入字符串或缓冲区中 而不是像这个示例那样 例如使用 HttpClient 和 XML API final LS
  • Laravel + PhpStorm:是否可以一步从路由定义跳转到函数?

    我们有很多路线 例如 Route get WebController index 当我想跳转到函数时 我必须 去上课WebController 转到函数index 是否可以一步从路由定义跳转到函数 您应该必须在 phpstorm 中安装 l
  • OpenGL Bindless 纹理:绑定到统一的sampler2D 数组

    我正在研究使用无绑定纹理来快速显示一系列图像 我的参考是OpenGL 4 5红皮书 这本书说我可以使用这个片段着色器在着色器中采样无绑定纹理 version 450 core extension GL ARB bindless textur