这是一个让我困扰和失去动力好几天的错误。也许有人有一些见识。
我以编程方式构建了一个地形网格并为其设置了一个可渲染对象,其材质具有纹理属性和从 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 上很难截屏,否则我会发布图片。