如何在OpenGL中加速在纹理上的绘画?(3.3 + / 4.1)

Jub*_*bei 3 c++ opengl drawing textures

我正在用鼠标在3D对象上绘图。

上面写有堆栈溢出的茶壶

我现在的操作方式是,通过片段着色器将UV坐标打包为RG像素,如下所示:

in highp vec2 UV;
out vec4 fragColor;
void main()
{
    fragColor.r = UV.x;
    fragColor.g = UV.y;
}
Run Code Online (Sandbox Code Playgroud)

我将它们渲染到屏幕外的FBO中,然后在鼠标下读取像素以获取CPU端的UV坐标。

float pixel_array[4];

CALL_GL(glReadBuffer(GL_COLOR_ATTACHMENT0));
CALL_GL(glReadPixels(normMouseX*WINDOW_WIDTH,normMouseY*WINDOW_HEIGHT,1,1,GL_RGBA,GL_FLOAT,pixel_array));

float u = pixel_array[0];
float v = pixel_array[1];
Run Code Online (Sandbox Code Playgroud)

然后,我使用这些UV坐标在正确的位置“绘制”纹理。

CALL_GL(glBindTexture(GL_TEXTURE_2D, mesh.diffuseTexture));
CALL_GL(glTexSubImage2D(GL_TEXTURE_2D,
        0,
        u*diffuseTextureWidth,
        v*diffuseTextureHeight,
        5,
        5,
        GL_RGBA,
        GL_UNSIGNED_BYTE,
        brush_pixels));
Run Code Online (Sandbox Code Playgroud)

问题是,取决于纹理的分辨率,此过程非常缓慢。有什么办法可以加快速度吗?

dat*_*olf 5

我将它们渲染到屏幕外的FBO中,然后在鼠标下读取像素以获取CPU端的UV坐标。

确保仅在确实需要时才从该纹理进行回读。也尝试突发读回。读取单个像素通常效率很低。一旦更新了整个纹理(在更改视图之后),便可以读取整个纹理,这非常有效。

要加快绘制到纹理的速度而不是glTexSubImage2D对其进行着色,只需将其作为颜色附件绑定到FBO,然后使用常规的OpenGL绘制操作对其进行绘制。