gpt4 book ai didi

OpenGL:从 GPU 检索浮点计算结果

转载 作者:行者123 更新时间:2023-12-02 04:42:49 25 4
gpt4 key购买 nike

简而言之

在单个着色器 channel 中,我在顶点着色器中应用了几个不同的模型转换矩阵,并将结果写入不同的位置向量。然后我在顶点着色器中对不同的结果进行一些简单的运算。

//Vertex Shader
in layout(location=0) vec3 position;
in layout(location=1) vec3 vertexColor;

...

out vec3 result1;
out vec3 result2;
out vec3 result3;
out vec3 color;

void main()
{
gl_Position = transformationMatrix * vec4(position, 1.0);
vec4 pos1 = transformationMatrix1 * vec4(position, 1.0);
vec4 pos2 = transformationMatrix2 * vec4(position, 1.0);

...

result1 = pos1.xyz * pos2.xyz / 0.012313879834;
result2 = (pos2.xyz + pos1.xyz) * 1.5;
result3 = ....;

color = vertexColor;
}

我想通过片段着色器传递的数学结果(因此值可以像颜色一样很好地插值)......

// Fragment shader
in vec3 color;

in vec3 result1;
in vec3 result2;
in vec3 result3;

layout(location = 0) out vec4 theColor;
layout(location = 1) out vec3 output1;
layout(location = 2) out vec3 output2;
layout(location = 3) out vec3 output3;

void main()
{
theColor = vec4(color, 1.0);
output1 = result1;
output2 = result2;
}

... 最终将它们读回,以便我可以继续处理 CPU 上的数据。我需要读回的数据是精确的(float 32)并且最好不要标准化为 [0, 1]。

关于这个我有几个问题:

  1. 最初我认为可以使用 GL_COLOR_ATTACHMENTi 来促进这一点,但我一直无法弄清楚如何做。是否可以?如果是这样,我该怎么做?
  2. 自 OpenGL 4.2 以来使用图像加载/存储功能的解决方案会是什么样子?是否有我需要注意的潜在陷阱?

编辑:毕竟我让它与颜色附件一起工作。请参阅下面的适合我的解决方案。

最佳答案

毕竟找到了使用颜色附件的解决方案。客户端代码如下所示,着色器不需要任何更改 iirc:

void initializeGL()
{
....

// Generate textures.
glGenTextures(3, textures.data());

for (GLuint id : textureIds)
{
// Bind texture and specify size and nature ...
glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, m_width, m_height, 0, GL_RGB, GL_FLOAT, nullptr);
}

glBindTexture(GL_TEXTURE_2D, 0);

....

// Attach texture images to Framebuffer.
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, otherTextureId, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, textureIds[0], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, textureIds[1], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, GL_TEXTURE_2D, textureIds[2], 0);

// Specify color buffers that will be written to.
const GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3};
glDrawBuffers(4, buffers);

....
}


void renderGL()
{
....

// Copy images into corresponding buffers in the main memory.
glReadBuffer(GL_COLOR_ATTACHMENT1);
glReadPixels(0, 0, m_width, m_height, GL_RGB, GL_FLOAT, texture1.data());
glReadBuffer(GL_COLOR_ATTACHMENT2);
glReadPixels(0, 0, m_width, m_height, GL_RGB, GL_FLOAT, texture2.data());
glReadBuffer(GL_COLOR_ATTACHMENT3);
glReadPixels(0, 0, m_width, m_height, GL_RGB, GL_FLOAT, texture3.data());

....
}

如有任何反馈,我们将不胜感激。

关于OpenGL:从 GPU 检索浮点计算结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36015969/

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