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)
问题是,取决于纹理的分辨率,此过程非常缓慢。有什么办法可以加快速度吗?
我将它们渲染到屏幕外的FBO中,然后在鼠标下读取像素以获取CPU端的UV坐标。
确保仅在确实需要时才从该纹理进行回读。也尝试突发读回。读取单个像素通常效率很低。一旦更新了整个纹理(在更改视图之后),便可以读取整个纹理,这非常有效。
要加快绘制到纹理的速度而不是glTexSubImage2D对其进行着色,只需将其作为颜色附件绑定到FBO,然后使用常规的OpenGL绘制操作对其进行绘制。