使用函数 glGenerateMipmap() 初步创建 mipmap
Preliminary creation of mipmap with function glGenerateMipmap()
使用 glGenerateMipmap() 命令在 Android (OpenGL ES 2.0/3.0) 中创建了 mipmap:
public class Renderer implements GLSurfaceView.Renderer {
private final int textureID;
public Renderer(Context context) {
textureID = loadTexture(bitmap)
}
public void onDrawFrame(GL10 glUnused) { // render loop
...
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
// use bilinear interpolation
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);
...
GLES20.glDrawElements(GLES20.GL_TRIANGLES, NUMBER_INDICES, GLES20.GL_UNSIGNED_INT, 0);
...
}
}
加载纹理的函数 (Kotlin):
private fun loadTexture(bitmap: Bitmap): Int {
val textureId = IntArray(1)
GLES20.glGenTextures(1, textureId, 0)
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0])
// loading two-dimensional texture image
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)
// set filtering modes
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST_MIPMAP_NEAREST)
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
return textureId[0]
}
因此,伪像消失了,即 mipmap 是有效的。但是,当在某些物理设备上使用多个具有纹理的 3D 对象时,渲染会变慢(FPS 降低)。我将其与渲染循环中的 mipmap 生成相关联:
public void onDrawFrame(GL10 glUnused) {
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
}
问题:是否可以提前(在渲染循环开始之前)生成 mipmap,例如在 loadTexture() 函数中?
在 loadTexture() 函数的末尾添加了 glGenerateMipmap() 命令:
...
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
return textureId[0]
...
并从函数 onDrawFrame() 中删除了 glGenerateMipmap() 命令。我不完全确定这是正确的,但它似乎运作良好。
使用 glGenerateMipmap() 命令在 Android (OpenGL ES 2.0/3.0) 中创建了 mipmap:
public class Renderer implements GLSurfaceView.Renderer {
private final int textureID;
public Renderer(Context context) {
textureID = loadTexture(bitmap)
}
public void onDrawFrame(GL10 glUnused) { // render loop
...
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID);
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
// use bilinear interpolation
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);
...
GLES20.glDrawElements(GLES20.GL_TRIANGLES, NUMBER_INDICES, GLES20.GL_UNSIGNED_INT, 0);
...
}
}
加载纹理的函数 (Kotlin):
private fun loadTexture(bitmap: Bitmap): Int {
val textureId = IntArray(1)
GLES20.glGenTextures(1, textureId, 0)
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId[0])
// loading two-dimensional texture image
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0)
// set filtering modes
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST_MIPMAP_NEAREST)
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
return textureId[0]
}
因此,伪像消失了,即 mipmap 是有效的。但是,当在某些物理设备上使用多个具有纹理的 3D 对象时,渲染会变慢(FPS 降低)。我将其与渲染循环中的 mipmap 生成相关联:
public void onDrawFrame(GL10 glUnused) {
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
}
问题:是否可以提前(在渲染循环开始之前)生成 mipmap,例如在 loadTexture() 函数中?
在 loadTexture() 函数的末尾添加了 glGenerateMipmap() 命令:
...
GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D)
return textureId[0]
...
并从函数 onDrawFrame() 中删除了 glGenerateMipmap() 命令。我不完全确定这是正确的,但它似乎运作良好。