gpt4 book ai didi

c++ - 在纹理中的 CPU 和 GPU 之间传递数据

转载 作者:行者123 更新时间:2023-11-28 02:37:49 24 4
gpt4 key购买 nike

所以我有一个非常复杂的 R^4 -> R^4 函数,我需要为大量输入 glm::vec4s 实时计算它,所以我想在 GPU 上为所有vec4s 并行。

我想我会创建一个 GL_RGBA32F 纹理,1920x1 分辨率(1920 足以满足我的目的),将我的输入数据复制到纹理上,然后调用一条线的绘图,因此光栅化器为每个调用一个片段我的 vec4s。然后使用 imageload/store 将结果写回纹理或将其渲染到 1920x1 帧缓冲区,然后从那里读取。

问题是由于某种原因 opengl 无法读取我的 GL_RGBA32F 纹理。

这是我的代码:

设置纹理(当前加载了虚拟数据):

glm::vec4 texturedata[1920];
for (unsigned int i = 0; i < 1920; i++)
{
texturedata[i] = glm::vec4(1.0f, 1.0f, 1.0f, 1.0f);
}
glGenTextures(1, &datatexture);
glBindTexture(GL_TEXTURE_2D, datatexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 1920, 1, 0, GL_RGBA, GL_FLOAT, texturedata);

每次渲染之前:

glUseProgram(mprogram);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, datatexture);
glBindVertexArray(rasterizertriggervao);
glUniform1i(glGetUniformLocation(mprogram, "datatexture"), 0);
glDrawArrays(GL_LINES, 0, 2);

rasterizertriggervao 是 2 个 float :-1、1,顶点着色器从它开始在我的屏幕中间绘制一条漂亮的线。

片段着色器:

layout(binding = 0) uniform sampler2D datatexture;
out vec4 x;
void main()
{
x = vec4( (texture(datatexture, vec2(gl_FragCoord.x/1920.0, 0.0))).x, 0.0f, 0.0f, 1.0f );
}

所以这应该为我在屏幕中间画一条漂亮的红线。它画了一个黑色的。光栅化器调用了所有 1920x1 的片段,纹理被正确复制到 GPU(我安装了 Nvidia Nsight,它允许我调试 GPU,直接在 GPU 上检查纹理的内容等等,我检查了,纹理是充满 1.0f)。但是由于某种原因,采样不起作用。

我知道有更好的方法来实现 GPGPU,但是这个东西必须很好地适应更大的程序,这就是我需要它通过纹理工作的方式:)

最佳答案

您似乎没有为您的纹理设置纹理过滤器模式。现在,GL 的默认设置(不幸的是)使用 mip-mapping。但是你的纹理不是 mipmap 完整的,所以从中采样是行不通的。您应该添加 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREAST) 并且可能还添加 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREAST)

正如 Andon M. Coleman 已经在评论中指出的那样,您没有在正确的位置对纹理进行采样。你应该在你的情况下使用 vec2(gl_FragCoord.x/1920.0 + 0.5/1920.0, 0.5)。我也同意 Andon M. Coleman 的建议,直接使用 texelFetch(),因为您可以直接使用整数值 `gl_FragCoord.x'。

关于c++ - 在纹理中的 CPU 和 GPU 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26945357/

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