C++ OpenGL可以用于将实值三角形绘制到缓冲区中吗?
我需要实现一个图像重建,它涉及到在一个缓冲区中绘制代表图像中像素的三角形。这些三角形指定了一些要填充的浮点值。如果绘制的三角形重叠,则必须将重叠区域的值相加 有没有可能用OpenGL实现这一点?我想利用这样一个事实,光栅化三角形是一个基本的图形任务,可以在图形卡上加速。我已经有了这个算法的cpu实现,但它的速度还不够快。这是因为需要绘制大量三角形 具体而言,我的问题是:C++ OpenGL可以用于将实值三角形绘制到缓冲区中吗?,c++,opengl,gpu,C++,Opengl,Gpu,我需要实现一个图像重建,它涉及到在一个缓冲区中绘制代表图像中像素的三角形。这些三角形指定了一些要填充的浮点值。如果绘制的三角形重叠,则必须将重叠区域的值相加 有没有可能用OpenGL实现这一点?我想利用这样一个事实,光栅化三角形是一个基本的图形任务,可以在图形卡上加速。我已经有了这个算法的cpu实现,但它的速度还不够快。这是因为需要绘制大量三角形 具体而言,我的问题是: 我可以使用openGL绘制具有真实值的三角形吗?(或者我能想出一个使用颜色等的方法吗?) OpenGL可以在三角形重叠处添加值
GL\u FUNC\u ADD
,不过我相信片段着色器现在可以更轻松地完成glReadPixels()
将在绘制后将数据从缓冲区中取出我想给出一段代码作为答案在这里并不合适,因为你的问题非常广泛。因此,我将简单地用一些提示逐一回答您的问题
glGetSubData()
或glReadPixels
或其他方法。但是,根据要填充的矩阵的大小,下载完整缓冲区可能有点长(对于32位的单通道,2000x1000像素大约为4-5ms)。在GPU上进行所有处理,只提取少量有价值的信息,而不是在CPU上继续处理,可能会更有效之后,您只需要编写渲染函数。一个简单的
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);