与libgdx消失的3D纹理

时间:2013-09-27 19:30:55

标签: android opengl-es libgdx

这是一个让我困扰和消失了好几天的错误。也许有人有一些见解。

我以编程方式构建地形网格并为其设置可渲染,其材质具有纹理属性,该纹理属性具有从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上屏幕截图,否则我会发布一张图片。

0 个答案:

没有答案