- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究使用无绑定(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/
我正在寻找使用变量 sampler 的方法在 JSR223 Sampler、JSR223 PreProcessor、JSR223 PostProcessor 和所有其他 JSR223 脚本中。 还有一
我正在使用 AVPlayer 通过本地文件和在线 URL 播放声音。但是我报错了,找不到原因。我搜索但找不到解决方案。这是我的错误: Terminating app due to uncaught e
我想获取一个音频文件的bitRate,sampleRate,channelCount 我使用代码 @SuppressLint("NewApi") public void GetSampleR
我已经在 ubuntu 14.0.4 上安装了 Jmeter,但我无法在采样器列表中看到操作系统进程采样器。你能告诉我如何在 ubuntu 中获取 jmeter 的操作系统进程采样器吗? 我需要运行
我正在尝试通过 TCP 采样器将消息从 Jmeter 发送到服务器我已经配置了 IP、端口号和发送到消息框的消息,然后我开始访问服务器,此时我在 Jmeter 中收到以下警告。 同时让我知道 Jmet
我正在阅读 vignette为 rgen包提供了从一些常见分布中采样的头文件。在第一段中,它说: Please note, these samplers, just like the ones in
我有一个 jmx 脚本,其中每个肥皂请求都有一个 header 管理器。我想提取具有值的 SOAPAction 字段:"http://****.svc"并将其作为 http 采样器的名称。 我需要编码
我想使用“scikits.samplerate”,但安装失败。我正在使用适用于 Python 3.51 的 Windows10(64 位)和 Anaconda。 首先,我遵循了这个指令: https:
我在 JMeter 的线程组下设置了一个 TCP 采样器。数据是从 CSV 文件中选取的。第一行数据为鉴权数据,后面各行为实参数据。像下面这样的东西, AAAAAAA21 BBBBBBBCCCCCCC
我正在尝试使用 TCP 采样器运行一个简单的测试 当使用默认的 TCPClient 类时,在响应超时时间过去后,我从服务器收到了正确的响应,然后在采样器结果中出现错误 500: Response co
我有一个关于 TCP 采样器的问题:有没有一种方法可以发送一个 TCP 请求,并在不等待答案的情况下继续下一步的操作? 我想这样做是因为我发送了一个“pong”请求,如果这个“pong”得到的响应不能
一段时间以来我一直遇到这个问题,并编写了以下可以作为应用程序的主视图 Controller 文件运行的 swift 文件。执行后,它将播放一段短促的 1kHz 正弦波。它将同时从音频接口(interf
我有一个由函数 lda.collapsed.gibbs.sampler 生成的模型,来自 lda 包,我需要知道顶部单词的“相关性”。使用时 top.topic.words(result$to
我正在将 BSF Sampler 与此 javascript 一起使用: var tokenPass = '1234'; var serialNo = '1234578740905549583'; v
我是一个编程新手,有必要编写程序来使用 JMeter 进行负载测试,因为我找不到现有的 GUI 工具来执行我想做的事情。 我正在尝试使用 JMeter 插件“JMeter WebSocket Samp
我自己在 Jmeter 中面临同样的问题。 Mozilla firefox 正在自动打开,给定的 URL 不会自动打开。 我的测试计划是 线程组 jp@gc - Firefox 驱动程序配置 jp@g
在this demo Sampler of the Grid widget ,源代码选项卡显示调用名为 ComponentRenderer 的类的代码。 Map countryRatings = ne
我是 Audiokit 的初学者。我正在尝试使用 Audiokit 对和声实现泛音系列效果。我正在使用 Midi Sampler 和 AKappleSequencer 来演奏不同的音符。在泛音系列中,
我必须使用 JMeter 中的 Jmeter - WebDriver Sampler 提供凭据来登录网站。这是我的脚本, WWDS.browser.get('http://login.salesfor
我必须连续播放音频循环,并且能够不间断地即时重新加载音频文件。我已经尝试过这些解决方案: 使用 AKAudioPlayer 及其“replace(file:)”方法 -> 问题:替换文件超慢(1 秒)
我是一名优秀的程序员,十分优秀!