我有一个 2d 图形库,我想在 OpenGL 中使用它,以便能够混合 2d 和 3d 图形。最简单的方法似乎是使用 glDrawPixels,但许多最近的教程和论坛建议使用带有命令 glTexSubImage2D 的纹理,然后用这样的纹理绘制一个正方形。
我的问题是:为什么?优势在哪里?它只是多了一步(内存缓冲区->纹理->视频缓冲区,而不是内存缓冲区->视频缓冲区)。
由于 OpenGL 使用视频内存,因此使用简单的“绘制像素”一定非常慢,因为每次绘制都会进行大量 GPU/CPU 同步。
当您使用 glTexSubImage2D 时,您可以确保您的图像将(始终)驻留在速度很快的视频内存中。
在视频内存中加载纹理的一种方法可能是:
glCreateTextures(GL_TEXTURE_2D, 1, &texture->mId);
glTextureParameteri(mId, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTextureParameteri(mId, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
GLsizei numMipmaps = ((GLsizei)log2(std::max(surface->w, surface->h)) + 1);
glTextureStorage2D(*texture, numMipmaps, internalFormat, surface->w, surface->h);
glTextureSubImage2D(*texture, 0, 0, 0, surface->w, surface->h,
format, GL_UNSIGNED_BYTE, surface->pixels);
glGenerateTextureMipmap(*texture);
Run Code Online (Sandbox Code Playgroud)
如果您不想使用直接状态访问,请不要忘记绑定。
但是,如果您仍然想执行像素绘制(例如用于程序渲染),则必须编写自己的片段着色器以尽可能快