我正在3D对象上绘图。
我现在正在这样做的方法是通过Fragment着色器将UV坐标打包到RG像素中:
in highp vec2 UV;
out vec4 fragColor;
void main()
{
fragColor.r = UV.x;
fragColor.g = UV.y;
}
我将这些渲染到屏幕外的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];
然后我使用那些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));
问题在于,根据纹理的分辨率,这个过程非常慢。有没有办法加快这个速度?
答案 0 :(得分:5)
我将这些渲染到屏幕外的FBO,然后在鼠标下方读取像素以获取CPU端的UV坐标。
确保只有在真正需要时才从该纹理进行回读。还尝试破解回读。读取单个像素并且通常效率低下。读取整个纹理一旦更新(更改视图后)效率很高。
要加快绘制到纹理而不是glTexSubImage2D
,只需将其作为颜色附件绑定到FBO并使用常规OpenGL绘图操作绘制到它。