我有一个2d图形库,我想在OpenGL中使用它,以便能够混合2d和3d图形。最简单的方法似乎是使用glDrawPixels,但许多最近的教程和论坛建议使用glTexSubImage2D命令与纹理,然后使用该纹理绘制一个正方形。
我的问题是:为什么?有哪些优点?这只是增加了一个步骤(内存缓冲区->纹理->视频缓冲区,而不是内存缓冲区->视频缓冲区)。
我的问题是:为什么?有哪些优点?这只是增加了一个步骤(内存缓冲区->纹理->视频缓冲区,而不是内存缓冲区->视频缓冲区)。
这主要有两个原因:
glDrawPixels()
已经被弃用,在OpenGL核心配置文件或OpenGL ES中不再可用。很少情况下您只需要绘制一次图像。更常见的是,在每次重新绘制时重复绘制它。使用 glDrawPixels()
需要每次将图像数据传递给OpenGL。如果将其存储在纹理中,则可以重复绘制它,并且OpenGL每次都可以重复使用相同的数据。
要绘制纹理的内容,不一定必须设置着色器、绘制矩形等等。您可以使用 glBlitFramebuffer()
将纹理内容复制到显示器上。
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);
如果不想使用直接状态访问,请不要忘记绑定。
但是,如果您仍然希望执行像素绘制(例如用于程序渲染),则必须编写自己的片段着色器以尽可能快地进行。