无法在libgdx中关闭灯

时间:2016-02-28 11:58:09

标签: opengl libgdx textures

使用下面的代码,如果我关灯,蓝色框将为黑色。 enter image description here

但是对实体似乎没有影响,它仍然是丰富多彩的。代码有什么问题?请帮助谢谢。 enter image description here

package com.louxiu.game;

/**
 * Created by louxiu on 2/22/16.
 */

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.*;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute;
import com.badlogic.gdx.graphics.g3d.loader.ObjLoader;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;
import com.badlogic.gdx.math.Vector3;

public class TestApp implements ApplicationListener {
    private PerspectiveCamera camera;
    private ModelBatch modelBatch;
    private Model box;
    private ModelInstance boxInstance;
    public Model entityModel;
    public ModelInstance entityInstance;
    private Environment environment;

    @Override
    public void create() {
        // Create camera sized to screens width/height with Field of View of 75 degrees
        camera = new PerspectiveCamera(
                75,
                Gdx.graphics.getWidth(),
                Gdx.graphics.getHeight());

        // Move the camera 3 units back along the z-axis and look at the origin
        camera.position.set(0f, 0f, 3f);
        camera.lookAt(0f, 0f, 0f);

        // Near and Far (plane) repesent the minimum and maximum ranges of the camera in, um, units
        camera.near = 0.1f;
        camera.far = 300.0f;

        // A ModelBatch is like a SpriteBatch, just for models.  Use it to batch up geometry for OpenGL
        modelBatch = new ModelBatch();

        // A ModelBuilder can be used to build meshes by hand
        ModelBuilder modelBuilder = new ModelBuilder();

        // It also has the handy ability to make certain premade shapes, like a Cube
        // We pass in a ColorAttribute, making our cubes diffuse ( aka, color ) red.
        // And let openGL know we are interested in the Position and Normal channels
        box = modelBuilder.createBox(2f, 2f, 2f,
                new Material(ColorAttribute.createDiffuse(Color.BLUE)),
                Usage.Position | Usage.Normal
        );

        // A entityModel holds all of the information about an, um, entityModel, such as vertex data and texture info
        // However, you need an entityInstance to actually render it.  The entityInstance contains all the
        // positioning information ( and more ).  Remember Model==heavy ModelInstance==Light
        boxInstance = new ModelInstance(box, 0, 0, 0);

        String entity = "creeper/creeper";
        ObjLoader loader = new ObjLoader();
        entityModel = loader.loadModel(Gdx.files.internal(entity + ".obj"), new ObjLoader.ObjLoaderParameters(true));
        entityInstance = new ModelInstance(entityModel, 0, 0, 0);
        Texture texture = new Texture(Gdx.files.internal(entity + ".png"));
        entityInstance.materials.get(0).set(TextureAttribute.createDiffuse(texture));

        // Finally we want some light, or we wont see our color.  The environment gets passed in during
        // the rendering process.  Create one, then create an Ambient ( non-positioned, non-directional ) light.
        environment = new Environment();
        // environment.add(new DirectionalLight().set(1f, 1f, 1f, -1f, -0.8f, -0.2f));
        // environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.8f, 0.8f, 0.8f, 1.0f));
    }

    @Override
    public void dispose() {
        modelBatch.dispose();
        box.dispose();
    }

    @Override
    public void render() {
        // You've seen all this before, just be sure to clear the GL_DEPTH_BUFFER_BIT when working in 3D
        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);

        // For some flavor, lets spin our camera around the Y axis by 1 degree each time render is called
        camera.rotateAround(Vector3.Zero, new Vector3(0, 1, 0), 1f);
        // When you change the camera details, you need to call update();
        // Also note, you need to call update() at least once.
        camera.update();

        // Like spriteBatch, just with models!  pass in the box Instance and the environment
        modelBatch.begin(camera);
        modelBatch.render(boxInstance, environment);
        // modelBatch.render(entityInstance, environment);
        modelBatch.end();
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

1 个答案:

答案 0 :(得分:3)

您的波前模型可能没有法线,这是照明工作所必需的。

检查日志,应该会显示一条错误消息,告诉您不要完全使用ObjLoader。而是使用G3dModelLoader甚至更好:使用AssetManagerg3djg3db文件格式。

将您的模型从建模应用程序导出到例如FBX文件格式并使用fbx-conv进行转换。不要使用fbx-conv将.obj文件转换为.g3dx文件,这将无效。

顺便说一下,虽然不相关,但您可能需要考虑:

您的相机far / near比例非常高,通常不应使用near以下的1值。

与您的评论不同,ModelBatch is not used to batch geometry and not that comparable to SpriteBatch

ObjLoaderloadModel方法接受boolean,因此您不必为此创建ObjLoaderParameters(尽管如上所述,您不应该使用完全ObjLoader

您正在创建Texture而不再需要时正确处理它。这将导致潜在的资源泄漏。

每一帧都要创建一个新的Vector3会给GC带来压力并导致hick-up。只需使用Vector3.Y代替new Vector3(0, 1, 0)来解决问题。