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

标签 c++ opengl gpgpu

所以我有一个非常复杂的 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/

相关文章:

c++ - 创建动态数组?

c++ - QT SQLite select 不返回任何数据

c++ - Opengl/glsl 试图编写一个用于绘制四边形的着色器,但不确定如何处理屏幕纵横比的变化

c++ - 是否重用未定义的 glMapBufferRange 指针?

c++ - CUDA 线程在全局内存中的私有(private)位置写入错误结果

c++ - OpenGL在GPU上构建和使用数据

c++ - 文件输入问题 [C++]

php - 编译 swig 界面后缺少符号

opengl - 如何实现广告牌?

c++ - CUDA 5.5 : I can't use "printf" at kernel method and which device should I select at VisualStucio2010 "compute_xx,sm_xx"?