0

这是一个让我困扰和失去动力好几天的错误。也许有人有一些见识。

我以编程方式构建了一个地形网格并为其设置了一个可渲染对象,其材质具有纹理属性和从 PNG 文件创建的重复纹理。所有这一切似乎都可以正常工作,直到相机移动一段时间,比如沿着 x 或 z 轴,此时纹理最初会闪烁为黑色,并最终保持黑色,如果相机移动得足够远的话.

我用蓝色清除屏幕——所以网格仍然在渲染,只是没有纹理——所以它是纯黑色的。这发生在与相机放置有关的相同位置。一旦相机距离足够远,如果相机继续远离世界原点,问题仍然存在。

这个问题没有出现在桌面上,只有android。我正在使用 HTC EVO 4G 进行测试。我意识到这款手机的早期 Adreno GPU 存在一些严重的 3D 问题,但我肯定见过带有大纹理景观的游戏,或者至少是演示,它们都可以正常工作。我的网格有大约 5000 个三角形,通常渲染大约 30-40 fps。

我尝试过的一些事情:

  • 在 GIMP 导出选项中将 PNG 压缩更改为 0
  • 使用 JPG 而不是 PNG
  • 明确指定没有 mipmapping
  • 改变过滤模式
  • 不同大小和分辨率的PNG文件
  • 检查 glGetError

以下是相关代码:

private void createMesh(){
    mesh = new Mesh(true, vertices.length, indices.length, 
                    new VertexAttribute(Usage.Position, 3, "a_position"),
                    new VertexAttribute(Usage.Normal, 3, "a_normal"),
                    new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0"));

    float vertexData[] = new float[vertices.length * 8];

    for (int x = 0; x < vertices.length; x++) {
      vertexData[x*8] = vertices[x].position.x;
      vertexData[x*8+1] = vertices[x].position.y;
      vertexData[x*8+2] = vertices[x].position.z;
      vertexData[x*8+3] = vertices[x].normal.x;
      vertexData[x*8+4] = vertices[x].normal.y;
      vertexData[x*8+5] = vertices[x].normal.z;
      vertexData[x*8+6] = vertices[x].texCoord.x;
      vertexData[x*8+7] = vertices[x].texCoord.y;

    }
    mesh.setVertices(vertexData);   
    mesh.setIndices(indices);
  }

纹理在地形上重复,但我之前已经注释掉了 setWrap 行,问题仍然存在。

private void createRenderable(Lights lights){
    texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
    TextureAttribute textureAttribute1 = new TextureAttribute(TextureAttribute.Diffuse, texture);
    terrain = new Renderable();
    terrain.mesh = mesh;
    terrain.worldTransform.trn(-xTerrainSize/2, (float) -heightRange, -zTerrainSize/2);
    terrain.meshPartOffset = 0;
    terrain.meshPartSize = mesh.getNumIndices(); 
    terrain.primitiveType = GL10.GL_TRIANGLE_STRIP; // or GL_TRIANGLE_STRIP etc.
    terrain.material = new Material(textureAttribute1);
    terrain.lights = lights;
  }

请注意,减小远剪裁平面不会产生影响。

...
lights = new Lights();
        lights.ambientLight.set(0.2f, 0.2f, 0.2f, 1f);
        lights.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -1f, -0.8f, -0.2f));

        cam = new PerspectiveCamera(90, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(0, 0, 0);
        cam.lookAt(0,0,-1);
        cam.near = 0.1f;
        cam.far = 1000f;
        cam.update();
...



 @Override
    public void render () {
        ...

        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.graphics.getGL10().glClearColor( 0, 0, 1, 1 );
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        modelBatch.begin(cam);
        modelBatch.render(terrain);
        modelBatch.end();

      ...
    }

对此问题的任何见解都将受到高度赞赏。不幸的是,在 EVO 4G 上很难截屏,否则我会发布图片。

4

0 回答 0