我一直在尝试阐明以下生成的平面网格:
private Model createPlane(float w, float h, Texture texture) {
Mesh mesh = new Mesh(true, 4, 6, new VertexAttribute(Usage.Position, 3, "a_position"),
new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0"),
new VertexAttribute(Usage.Normal, 3, "a_normal"));
float w2 = w * this.CELL_SIZE;
float h2 = h * this.CELL_SIZE;
mesh.setVertices(new float[]
{ w2, 0f, h2, 0, 0, 0, 1, 0,
w2, 0f, -h2, 0, h, 0, 1, 0,
-w2, 0f, h2, w, 0, 0, 1, 0,
-w2, 0f, -h2 , w,h, 0, 1, 0
});
mesh.setIndices(new short[] { 0, 1, 2, 1, 3, 2});
Model model = ModelBuilder.createFromMesh(mesh, GL10.GL_TRIANGLES, new Material(TextureAttribute.createDiffuse(texture)));
return model;
}
并使用以下方式渲染:
//the environment setup
env = new Environment();
env.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
env.add(new PointLight().set(Color.ORANGE, 5f, 1f, 5f, 10f));
env.add(new DirectionalLight().set(Color.WHITE, -1f, -0.8f, -0.2f));
...
//the render method
batch.begin();
batch.render(inst, env);//inst is a ModelInstance created using the Model generated from createPlane(...)
batch.end();
网格可以正确显示(UV,纹理),并且似乎受到方向性和环境光的适当影响。
当我尝试添加点光源(请参见上述环境)时,从createPlane(...)生成的所有平面均不受影响。我尝试使用ModelBuilder类的createBox(...)创建其他几何图形,它似乎可以正确响应点光源。因此,我假设我没有正确生成平面,但是它显然受到方向性/环境光的影响这一事实使我有点失望。
值得注意的是,生成的平面的大小会有所不同,我不确定点光源是否会对4个顶点产生很大影响,但我没有什么比什么都期望的多了。移动点光源(靠近某些顶点)也不起作用。
任何帮助将不胜感激。
谢谢!
最佳答案
知道您使用的是哪个着色器将是很棒的。默认一个?我不确定他们是否已经解决了问题,不久前他们就有一个错误,即点光源仅在某些设备上起作用(这与制造商实现opengles有关。我个人使用自己的着色器进行了修正。
编辑:This seems to be fixed
我检查了我正在使用的代码。问题是要确定着色器中正确的灯光阵列。
最后是这样吗:
// on some devices this was working
int u_lightPosition = program.getUniformLocation("u_lightPosition[0]");
int u_lightColors = program.getUniformLocation("u_lightColor[0]");
if(u_lightPosition < 0 && u_lightColors < 0) {
// on others this was working
u_lightPosition = program.getUniformLocation("u_lightPosition");
u_lightColors = program.getUniformLocation("u_lightColor");
}
我希望这有帮助!