这是一个让我困扰和消失了好几天的错误。也许有人有一些见解。
我以编程方式构建地形网格并为其设置可渲染,其材质具有纹理属性,该纹理属性具有从PNG文件创建的重复纹理。所有这一切似乎都能正常工作,直到相机移动一段时间,比如x或z轴,此时纹理最初会闪烁为黑色,如果相机移动得足够远,最终会保持黑色
我用蓝色清除屏幕 - 所以网格仍在渲染,只是没有纹理 - 所以它是纯黑色。这种情况发生在相机位置相同的位置。一旦相机距离足够远,如果相机继续远离世界原点,则问题仍然存在。
问题没有出现在桌面上,只有android。我正在使用HTC EVO 4G进行测试。我意识到这款手机的早期Adreno GPU有一些严重的3D问题,但我肯定会看到游戏,或者至少是演示,大纹理景观工作正常。我的网格有大约5000个三角形,通常渲染大约30-40 fps。
我尝试过的一些事情:
以下是相关代码:
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上屏幕截图,否则我会发布一张图片。