c – 如何加快OpenGL中纹理的绘画速度? (3.3 /4.1)

我在3D对象上绘制鼠标.

我现在正在做的方式是我通过片段着色器将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));

问题是,根据纹理的分辨率,这个过程非常慢.有什么方法可以加快速度吗?

解决方法:

I render those to an Off-screen FBO, then readPixel under the mouse to get the UV coords on the CPU side.

确保只有在真正需要时才从该纹理中进行回读.还尝试破解回读.读取单个像素并且通常效率低下.读取整个纹理一次更新(更改视图后)是有效的.

为了加快绘制到纹理而不是glTexSubImage2D-it,只需将它作为颜色附件绑定到FBO并使用常规OpenGL绘图操作绘制到它.

上一篇:使用OpenGLEs for Android绘制Pixel


下一篇:c# – 如何知道WPF中何时呈现(绘制)控件(或窗口)?