当前位置: 首页 > 知识库问答 >
问题:

从uint64_t图像句柄创建image2D

徐德海
2023-03-14

要在OpenGL中使用无绑定图像,需要使用glGetImageHandleARB创建GLuint64句柄。然后,可以将此句柄设置为统一的image2D变量,并使用图像,就像使用旧方法绑定一样。没问题。使用纹理/采样器,还可以将(纹理)控制柄设置为普通统一的uint64_t变量,而不是sampler2D。然后,可以使用该句柄在运行时使用构造函数sampler2D(句柄)来“构造”采样器对象。

扩展描述说:

取样器使用64位整数句柄表示,并且可以使用构造函数将取样器转换为64位整数。

图像使用64位整数句柄表示,可以使用构造函数将图像转换为64位整数或从64位整数转换为64位整数。

所以我假设图像的构造与采样器的工作方式相同,但事实并非如此。示例代码:

#version 450
#extension GL_ARB_bindless_texture : enable
#extension GL_NV_gpu_shader5 : enable

layout(bindless_image, rgba8) uniform image2D myBindlessImage;

uniform uint64_t textureHandle;
uniform uint64_t imageHandle;

void main()
{
    sampler2D mySampler = sampler2D(textureHandle); // works like a charm
    ... = texture(mySampler, texCoord);

    ... = imageLoad(myBindlessImage, texCoordI); // works like a charm

    layout(rgba8) image2D myImage = image2D(imageHandle); // error C7011: implicit cast from "uint64_t" to "int"
    ... = imageLoad(myImage, texCoordI);
}

显然,编译器不知道扩展描述中提到的image2D(uint64_t)构造函数和image2D(uvec2)构造函数。我是否遗漏了一些东西,或者这只是现在没有实现,尽管它应该实现?我现在使用的视频驱动程序是Nvidia的355.82。如果有人能告诉我这是否适用于任何其他驾驶员/供应商的卡,我将非常高兴。

顺便问一下,我为什么需要这个功能:与纹理控制柄不同,图像控制柄不识别整个底层数据,而只识别一个纹理级别。如果要在着色器中执行任何mipmap或其他分层工作,并且需要绑定多个/所有纹理级别,可以在缓冲区中提供所有级别的句柄,然后根据需要在着色器运行时构造它们。现在,你必须为你的n个纹理级别定义n个不同的统一的Image2D,这相当繁琐,尤其是当图像大小改变时。

附录:重现编译错误的最快方法是只放入image2D(0lu);在着色器代码中的某个地方。

共有1个答案

陈实
2023-03-14

您使用的语法错误。向图像uint64_t的正确语法是:

layout(rgba8) image2D myImage = layout(rgba8) image2D(imageHandle);

它需要多次指定格式。我不知道为什么,也不知道为什么需要指定格式。很遗憾,规范在这一点上含糊不清。

 类似资料:
  • 当你用作图命令时,MATLAB用多种图形对象创建图形,例如线,文本,表面(完整列表见Graphics Objects)。所有图形对象都有控制其性能的属性。你可以在MATLAB中询问每种属性的取值并设置大部分的属性值。 每当MATLAB创建一个图形对象时,它就给该对象赋以一个标识符(称为句柄)。可以用此句柄访问对象属性。若你想作下列操作,句柄图形很有用。 修改图形外观。 通过编写能直接创建和操作对象

  • 我在我的词典应用程序中使用了第一个刀柄,但是当我运行我的应用程序时,它会崩溃并显示此日志: 这是我的模块类:`@ Module @ InstallIn(singleton component::class)object word info Module { 这是我的主活动类,它初始化视图模型并尝试使用它: 这是我的观点模型: 问题出在哪里,怎么解决?

  • 我是AWS世界的新手。我正在做一个项目,建立一个服务器少的应用程序,作为其中的一部分,我已经创建了4 lambda,工作正常。 接下来,我尝试使用CDK创建一个部署管线;下面是我想做的。 > 从同一个图像创建4个不同的lambda,只需覆盖docker图像中的CMD,并提及lambda处理程序 我在本地安装了CDK,并能够创建堆栈,一切正常。 下面是我的代码片段 --创建docker映像 --从d

  • 我知道这个问题已经在这里和这里被问过了,但我仍然无法创建带有手柄的导航抽屉。 我使用了下面提到的类:: DrawerHandle:: 我仍然无法得到想要的输出:: 到目前为止我所做的: 主活动:: 活动_main。xml 到目前为止,我得到了: 现在,当我点击抽屉把手图标时,我得到了以下错误。。。 Logcat:: 请让我知道你的宝贵建议。 任何链接/指导都将是有帮助的...... 提前感谢。。。

  • 问题内容: 我想从用户上传的图像创建缩略图,以使图像看起来不被挤压。但也想要原始图像的副本。因此,我希望原始图像将原始图像发送到我的服务器,并创建一个拇指版本并将其发送到我的服务器,以便我可以为每个上传自己的图片。 我的用户表有2个表 我对编码的图像方面并不感到热衷,但这是到目前为止。 Imageupload.php media.profileimage.upload.php 不胜感激任何帮助或指

  • 作为程序的一部分,我需要显示属于一个文件夹(JPG文件)的图像。为此,我有以下代码: 如果我在移动文件管理器中浏览该文件,并打开该文件,它是正确的显示,所以,图像格式没有问题。此外,该图像是用相机拍摄的,与其他正确解码的图像相同。 如何解决这个问题,或者,有没有替代的方法来做到这一点?