OES 纹理是 OpenGL ES 扩展中的一种纹理类型,可以通过下采样的方式得到新的 OES 纹理。下面是具体的代码实现:

  1. 创建 OES 纹理对象
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
  1. 设置 OES 纹理参数
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  1. 绑定 OES 纹理到 FBO
GLuint fboId;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, textureId, 0);
  1. 设置渲染目标和视口
glViewport(0, 0, width, height);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
  1. 渲染场景到 OES 纹理
// 绘制场景
  1. 生成新的 OES 纹理
GLuint newTextureId;
glGenTextures(1, &newTextureId);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, newTextureId);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA, width / 2, height / 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  1. 绑定新的 OES 纹理到 FBO
GLuint newFboId;
glGenFramebuffers(1, &newFboId);
glBindFramebuffer(GL_FRAMEBUFFER, newFboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, newTextureId, 0);
  1. 设置新的渲染目标和视口
glViewport(0, 0, width / 2, height / 2);
glBindFramebuffer(GL_FRAMEBUFFER, newFboId);
  1. 渲染 OES 纹理到新的 OES 纹理
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
  1. 解绑 FBO 和纹理
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);

通过上述步骤可以得到经过下采样后的新的 OES 纹理。

OpenGL ES 下采样 OES 纹理:代码实现和步骤

原文地址: https://www.cveoy.top/t/topic/ohdb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录