Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL可以用于将实值三角形绘制到缓冲区中吗?_C++_Opengl_Gpu - Fatal编程技术网

C++ OpenGL可以用于将实值三角形绘制到缓冲区中吗?

C++ OpenGL可以用于将实值三角形绘制到缓冲区中吗?,c++,opengl,gpu,C++,Opengl,Gpu,我需要实现一个图像重建,它涉及到在一个缓冲区中绘制代表图像中像素的三角形。这些三角形指定了一些要填充的浮点值。如果绘制的三角形重叠,则必须将重叠区域的值相加 有没有可能用OpenGL实现这一点?我想利用这样一个事实,光栅化三角形是一个基本的图形任务,可以在图形卡上加速。我已经有了这个算法的cpu实现,但它的速度还不够快。这是因为需要绘制大量三角形 具体而言,我的问题是: 我可以使用openGL绘制具有真实值的三角形吗?(或者我能想出一个使用颜色等的方法吗?) OpenGL可以在三角形重叠处添加值

我需要实现一个图像重建,它涉及到在一个缓冲区中绘制代表图像中像素的三角形。这些三角形指定了一些要填充的浮点值。如果绘制的三角形重叠,则必须将重叠区域的值相加

有没有可能用OpenGL实现这一点?我想利用这样一个事实,光栅化三角形是一个基本的图形任务,可以在图形卡上加速。我已经有了这个算法的cpu实现,但它的速度还不够快。这是因为需要绘制大量三角形

具体而言,我的问题是:

  • 我可以使用openGL绘制具有真实值的三角形吗?(或者我能想出一个使用颜色等的方法吗?)
  • OpenGL可以在三角形重叠处添加值吗?(再一次,我可以处理一个黑客,比如颜色混合)
  • 我能否将像素的实际值恢复为浮点数组或类似数组,以便进一步处理
  • 我是否对在OpenGL中绘图->使用GPU绘图->可能更快执行的想法有误解
  • 此外,我希望在虚拟机上运行这段代码,因此就我所知,使用OpenGL加速比使用Cuda之类的工具来实现更可行。这是真的吗

    编辑:这里是否可以选择累积缓冲区

  • 如果32位浮点数足够,那么答案似乎是肯定的:
  • 即使在旧的固定管道下,您也可以使用混合模式和函数
    GL\u FUNC\u ADD
    ,不过我相信片段着色器现在可以更轻松地完成
  • glReadPixels()
    将在绘制后将数据从缓冲区中取出
  • OpenGL有一些软件实现,但是在设置上下文时,您可以选择。使用GPU应该比CPU快得多
  • 不知道。我从未在虚拟机上使用过OpenGL或CUDA。我从来没用过CUDA

  • 我想给出一段代码作为答案在这里并不合适,因为你的问题非常广泛。因此,我将简单地用一些提示逐一回答您的问题

  • 是的,用openGL绘制三角形是小菜一碟。您可以为每个三角形提供3个垂直,使用适当的着色器,您可以绘制三角形、填充三角形或仅绘制边,无论您想要什么。您似乎需要一个较大的集合(大于[0255]),因为许多三角形可能重叠,并且每个三角形的值可能大于一个。这不是问题。您可以填充32位精度的单通道帧缓冲区。在您的情况下,只有一个通道就足够了
  • 是的,混合在openGL上永远存在。因此,无论您选择使用哪种版本的openGL,都会有一种方法来增加测试的值
  • 是的,根据您的实现情况,您可能必须使用
    glGetSubData()
    glReadPixels
    或其他方法。但是,根据要填充的矩阵的大小,下载完整缓冲区可能有点长(对于32位的单通道,2000x1000像素大约为4-5ms)。在GPU上进行所有处理,只提取少量有价值的信息,而不是在CPU上继续处理,可能会更有效
  • 执行速度无疑会更快。然而,从GPU内存下载数据通常没有得到优化(上传是不受限制的)。因此,您在处理过程中赢得的时间可能会在下载过程中丢失。我从未在虚拟机上使用过openGL,因此性能的额外损失对我来说是未知的
    之后,您只需要编写渲染函数。一个简单的
    glDraw*()
    就足够了。请记住正确绑定缓冲区。使用适当的功能启用混合。您可能还希望为您的案例禁用抗锯齿。一开始我会说你需要一个正交投影,但我没有你问题的所有元素,所以这取决于你


    长话短说,如果您从未使用过openGL,那么只有在您阅读了一些关于openGL/GLSL的文档/教程后,上面的代码才有意义。

    谢谢您的回答。下载速度很有趣,但在我的例子中,三角形与图像的比率非常高,所以这可能不是问题。如果提供一个将两个重叠的三角形绘制到缓冲区中的示例对您来说很简单,那么这将非常有帮助。三角形的大小无关紧要,输出缓冲区的大小无关紧要。这将决定下载时间。例如,我可以提供您需要的步骤,但不能提供代码。这取决于你根据这里的提示学习openGL。我不是指三角形的大小,我是指在下载图像之前绘制的三角形的数量。图像下载将是非常罕见的。代码也没关系。我只是想看看我能得到什么!再次感谢。我昨天没空。我更新了答案。我只写了一段初始化代码。我最后意识到,如果没有一个正常工作的openGL环境,这段代码将毫无用处。利用GPU与您的问题相关,因此您可能需要自己了解更多关于此主题的信息。感谢您的回答!你能简单地解释一下GL_FUNC_ADD和片段着色器之间的区别吗?当然,这个话题可能太宽泛了,无法发表评论!看起来普通的gl混合函数实际上仍然是正确的方法,而不是尝试在片段着色器中进行添加。
    gl\u FUNC\u ADD
    是混合函数的一部分:
    glBlendEquationSeparate()​<代码>GL_FUNC_ADD
    只是默认值。这实际上适用于一般的混合方程(颜色和alpha的默认值为ADD)<代码>glBlendEquationSeparate
    //Struct definition
    struct Triangle {
        float[2] position;
        float intensity;
    };
    
    //Init
    glGenBuffers(1, &m_buffer);
    glBindBuffer(GL_ARRAY_BUFFER, 0, m_buffer);
    glBufferData(GL_ARRAY_BUFFER, 
        triangleVector.data() * sizeof(Triangle), 
        triangleVector.size(), 
        GL_DYNAMIC_DRAW);
    glBindBufferBase(GL_ARRAY_BUFFER, 0, 0);
    
    glGenVertexArrays(1, &m_vao);
    glBindVertexArray(m_vao);
    glBindBuffer(GL_ARRAY_BUFFER, m_buffer);
    glVertexAttribPointer(
        POSITION, 
        2, 
        GL_FLOAT, 
        GL_FALSE, 
        sizeof(Triangle), 
        0);
    glVertexAttribPointer(
        INTENSITY, 
        1, 
        GL_FLOAT, 
        GL_FALSE, 
        sizeof(Triangle), 
        sizeof(float)*2);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    
    glGenTextures(1, &m_texture);
    glBindTexture(GL_TEXTURE_2D, m_texture);
    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_R32F,
        width,
        height,
        0,
        GL_RED,
        GL_FLOAT,
        NULL);
    glBindTexture(GL_FRAMEBUFFER, 0);
    
    glGenFrameBuffers(1, &m_frameBuffer);
    glBindFrameBuffer(GL_FRAMEBUFFER, m_frameBuffer);
    glFramebufferTexture(
        GL_FRAMEBUFFER,
        GL_COLOR_ATTACHMENT0,
        m_texture,
        0);
    glBindFrameBuffer(GL_FRAMEBUFFER, 0);