Opengl 如何将GPU全局内存中的像素阵列直接显示在屏幕上?
我在GPU上做了一个路径跟踪器,我在GPU全局内存上得到了一些像素数据的跟踪结果(这是一个float3数组),我在屏幕上显示数组的方法是将数组复制到CPU内存,并调用OpenGLOpengl 如何将GPU全局内存中的像素阵列直接显示在屏幕上?,opengl,cuda,gpu,Opengl,Cuda,Gpu,我在GPU上做了一个路径跟踪器,我在GPU全局内存上得到了一些像素数据的跟踪结果(这是一个float3数组),我在屏幕上显示数组的方法是将数组复制到CPU内存,并调用OpenGLglTexImage2D: glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixelArray); 然后显示纹理pixelArray是要显示的像素数据数组。由于GPU是管理整个渲染过程的设备,是否有
glTexImage2D
:
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixelArray);
然后显示纹理pixelArray
是要显示的像素数据数组。由于GPU是管理整个渲染过程的设备,是否有一种方法可以在屏幕上显示像素阵列
,而无需将数据从GPU复制到CPU 我做了一次,渲染数据驻留在GPU全局内存中的图像。
您将需要并与CUDA一起运行它。目前它只在Windows上工作
我仍然使用这个函数来渲染GPU图像。只要调用ShowRawImage
,您就完成了
它唯一的开销是从全局内存到OpenGL设备缓冲区的内存拷贝。但是它更好,因为它是一个设备到设备的拷贝。使用CUDA OpenGL图形互操作将OpenGL纹理映射为CUDA全局内存。直接将数据写入纹理或使用cudaMemcpy2D。您所说的“彩色像素阵列”到底是什么意思?你说的是一个存储像素数据的OpenGL缓冲区对象,一块存储像素数据的CUDA内存,还是什么?那只是一个浮点3(RGBcolor)类型的数组,存储在GPU全局内存中@NicolasBolasRight,但您将其标记为OpenGL和CUDA。它们中的每一个都有各自独立的方式在GPU全局内存中存储数据数组。使用哪种方式会影响将其粘贴到纹理中的选项。那是哪一个呢?我们可以忘记OpenGL。像素数据确实存在于cuda全局内存中,如[(R,G,B),(R,G,B),…,(R,G,B)],将这样的阵列直接放在屏幕上而不涉及CPU将减少开销@NicolBolas@Tony:不,我们不能忘记OpenGL。CUDA有图形和OpenGL互操作。您可以将OpenGL纹理映射为CUDA全局内存阵列。要么直接将数据写入贴图纹理,要么在纹理贴图中执行cudaMemcpy2D。