jjzjj

Android OpenGL 纹理 : creating and deleting them on the fly

coder 2023-12-10 原文

我目前正在实现一个 3D 查看器,它基本上可以呈现用户在其 SD 卡上拥有的所有图像的子集。我想到的最匹配的产品是 CoolIris:

它只是在屏幕上显示一个由 N 个图 block 组成的滚动板,每个图 block 显示不同的图像,新图 block 进入屏幕并显示新图像。

现在我的问题是:我的程序可以正常工作并很好地渲染四边形。当四边形离开屏幕时,它会被回收/释放。新的四边形在进入屏幕之前不断被添加到拼贴板上。

因为可能有数百张图像,所以需要即时创建和删除纹理(这样我们就不会耗尽内存)。我遇到的问题是,在我删除纹理后,新创建的纹理似乎获得了当前正在使用的其他纹理的一些 ID。

我的渲染循环看起来像这样:

void render(GL10 gl) {
  0. Move the camera

  // Tile board maintenance
  1. Remove tiles out of screen
  2. Add new tiles which are about to enter screen

  // Texture handling
  3. glDeleteTextures on all unused textures followed by glFlush
  4. For newly used images
     - Create corresponding Bitmap
     - Create the OpenGL texture, followed by glFlush
     - Release the Bitmap

  // Rendering
  5. Render the tile (using a textured quad)

}

为了更好地了解数据的组织方式,这里是类的概述:

TileBoard {
  Image[] allImages;
  Tile[] board;
}

Tile {
  Image image;
}

Image {
  String path;
  int textureId;
  int referenceCount;
}

纹理创建代码:

protected void loadSingleTexture(GL10 gl, long objectId, Bitmap bmp) {
    int[] textures = new int[1];
    gl.glGenTextures(1, textures, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
    gl.glFlush();

    if (bmp != null) bmp.recycle();

    if (listener != null) listener.onTextureLoaded(gl, objectId, textures[0]);
}

纹理删除代码:

// pendingTextureUnloads is a Set<Integer>
if (pendingTextureUnloads.size() > 0) {
  int[] textureIds = new int[pendingTextureUnloads.size()];
  int i = 0;
  Iterator<Integer> it = pendingTextureUnloads.iterator();
  while (it.hasNext()) {
    textureIds[i] = it.next();
  }

  gl.glDeleteTextures(textureIds.length, textureIds, 0);
  gl.glFlush();
}

最佳答案

我已经解决了这个问题:问题是您必须保留传递给 glGenTextures 的纹理数组并重新使用它。

这里是为遇到同样问题的人修改的概述:

Image {
  String path;
  int[] textureIds;
  int referenceCount;
}

纹理创建代码:

// Notice that I don't allocate the int[] at the beginning but use the one of the image
protected void loadSingleTexture(GL10 gl, Image img, Bitmap bmp) {
    gl.glGenTextures(1, img.textureIds, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, img.textureIds[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
    gl.glFlush();

    if (bmp != null) bmp.recycle();
}

纹理删除代码:

foreach Image img {
  gl.glDeleteTextures(img.textureIds.length, img.textureIds, 0);
}
gl.glFlush();

关于Android OpenGL 纹理 : creating and deleting them on the fly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683807/

有关Android OpenGL 纹理 : creating and deleting them on the fly的更多相关文章

  1. javascript - 如何等待纹理完成从 Three.js 中的 JSON 模型加载? - 2

    我有一个基于AlteredQualia的蒙皮示例成功加载的JSON模型。但是,我不想在加载完成之前透露模型。正如您在此示例中所见,模型首先出现,然后才加载它们的纹理资源:http://alteredqualia.com/three/examples/webgl_animation_skinning_tf2.html我在网页中添加了一个不透明的div,然后使用JSONloader.load()函数的回调将那个div移开。不幸的是,当网格添加到场景时会触发此回调,场景似乎并未被仍在加载的蒙皮图像阻挡,所以我最终“揭示”了一个不完整的场景。我应该如何解决这个问题?我已经看到有一个函数THRE

  2. javascript - Three.js中如何使用相机作为纹理图像 - 2

    在three.js中,我试图创建一个纹理,其图像是从相机看到的当前场景。使用CubeCamera来创建类似的效果是有据可查的;我用CubeCamera创建了一个场景示例来说明我的目标:http://stemkoski.github.com/Three.js/Camera-Texture-Almost.html但是,我想使用普通相机(而不是立方体相机)作为纹理。我怎么能这样做? 最佳答案 理想情况下这会起作用。初始化:renderTarget=newTHREE.WebGLRenderTarget(512,512,{format:THR

  3. javascript - 用户在 three.js 中上传纹理 - 2

    Here你会发现问题的jsFiddle改编。我想创建一个3d网络应用程序,用户可以在其中选择本地计算机上的图像文件:选择文件后,图像将作为参数加载到THREE.ShaderMaterial对象中。将glsl着色器应用于图像,并将结果呈现给浏览器中的容器:$("#userImage").change(function(){vartexture=THREE.ImageUtils.loadTexture($("#userImage").val());texture.image.crossOrigin="anonymous";shader.uniforms.input.value=textur

  4. javascript - 读取 WebGLTexture 中的像素(将 WebGL 渲染到纹理) - 2

    我在GPU上生成纹理并将其渲染到我自己的帧缓冲区对象。它工作正常,纹理被渲染到我可以传递给其他着色器的WebGLTexture。但是我想访问javascript中的WebGLTexture像素。有办法实现吗?目前我正在使用gl.ReadPixels在我将纹理绘制到我的帧缓冲区后读取像素。这工作正常,但如果我可以直接访问WebGLTextureObject中的像素不是更好吗?我想要完成的是:我有GLSLperlin噪声着色器,可以在GPU上渲染高清高度图和法线贴图。我想将高度图传递给CPU,以便为网格生成顶点。我当然可以只在顶点着色器中定位顶点,但我需要它在CPU中进行碰撞检测。我希望我

  5. javascript - 如何使用新的 THREE.TextureLoader 加载多个纹理 - 2

    如何使用Three.js中的新THREE.TextureLoader加载多个纹理?目前我正在像这样加载我的纹理:vartexture1=THREE.ImageUtils.loadTexture('texture1.jpg');vartexture2=THREE.ImageUtils.loadTexture('texture2.jpg');vartexture3=THREE.ImageUtils.loadTexture('texture3.jpg');vartexture4=THREE.ImageUtils.loadTexture('texture4.jpg');vartexture5=

  6. javascript - three.js 立方体使用多个纹理的验证 - 2

    有人可以为three.jsr53验证以下代码吗?取自这个问题:HowtousemultiplematerialsinaThree.jscube?我尝试了这段代码和一些变体,但我没有看到可见的立方体。我的纹理图像按应有的方式命名。varmaterials=[];for(vari=0;i 最佳答案 改为这样做:varcubeGeo=newTHREE.BoxGeometry(400,400,400,1,1,1);varcube=newTHREE.Mesh(cubeGeo,materials);materials是一个包含6个three.j

  7. javascript - Three.js - 没有纹理绑定(bind)到单元 0 错误 - 2

    自从今天的Chrome更新(版本50.0.2661.86(64位)OSX)以来,我基于three.js的应用程序开始输出此警告:[.CommandBufferContext]渲染警告:没有绑定(bind)到单元0的纹理并且应用程序不再加载(它只是停留在加载屏幕上)。为了给出这个错误的奇怪背景,我们用纹理+法线贴图实例化网格,并且有一个奇怪的行为:-如果我们加载应用程序崩溃的所有实例-如果我们加载更少的实例,应用程序加载关于信息,我们在Material创建回调中加载了所有纹理,因此之前的Stackoverflow答案提供了有关此问题的解决方案并没有真正起作用。有没有人知道我们可以改变什么

  8. javascript - 球体上的纹理未正确对齐?纬度/经度 -> 笛卡尔 xyz - 2

    我想知道我的球体的纹理是否以某种方式没有正确应用,我是否可以以某种方式抵消它?我试图通过提供纬度/经度并转换为笛卡尔xyz坐标来在澳大利亚悉尼放置一个盒子。但是,盒子没有放在正确的位置。我的猜测是因为原始图像是墨卡托map,所以当它应用于球体时,纬度/经度中心点不正确。下面的代码是一个最小的可重现示例。我正在加载地球图像并将其应用于球体(半径=400)。然后我提供澳大利亚悉尼的纬度/经度(33.8688,-151.2093)并转换为弧度。将纬度/经度转换为笛卡尔xyz(取自:https://stackoverflow.com/a/1185413/3723165)翻译一个盒子并将其推到该

  9. javascript - 如何为 BufferGeometry 面添加纹理。? - 2

    我创建了一个bufferGeometry,它由5个平面(100x25)组成,每个平面有两个三Angular形。functioncreateGeometry(){vargeometry=newTHREE.PlaneGeometry(100,25,1);returngeometry;}functioncreateScene(){varbufferGeometry=newTHREE.BufferGeometry();varradius=125;varcount=5;varpositions=[];varnormals=[];varcolors=[];varvector=newTHREE.Ve

  10. javascript - 旋转相机时重复纹理严重扭曲/抖动 - 2

    我最初在gamedev上问过这个问题,但没有一个答案有助于解决问题,我仍然不知道真正的原因是什么。我在常见问题解答中没有看到任何关于在SE中重新发布问题的内容,所以我只能希望这没问题。此外,回想起来,这个问题可能更多地与图形编程有关,而不仅仅是游戏开发。编辑1开始原帖的行为仅适用于WindowsXP和Windows7,浏览器Firefox和Chrome。在Ubuntu上,没有这种失真,而是在旋转相机时纹理“抖动”。当旋转停止时,抖动停止,但纹理可能不在完全正确的位置。编辑1结束编辑3开始该程序已在4台不同的计算机上进行了测试,但在其中任何一台计算机上均未按预期运行。编辑3端我在WebG

随机推荐