Java LibGDX着色器不工作

Java LibGDX着色器不工作,java,opengl,libgdx,Java,Opengl,Libgdx,我试图使用LibGDX渲染独立的立方体网格块,为了使它们独立,我为网格封装创建了一个立方体类。这是我写的代码 import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.glutils.ShaderProgram; import com.badlogic.gdx.math.Matrix4; public class Cube { private static

我试图使用LibGDX渲染独立的立方体网格块,为了使它们独立,我为网格封装创建了一个立方体类。这是我写的代码

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.*;
import com.badlogic.gdx.graphics.glutils.ShaderProgram;
import com.badlogic.gdx.math.Matrix4;

public class Cube {

private static final String VERTEX_SHADER =
        "attribute vec4 position;\n" +
                "attribute vec4 color;\n" +
                "uniform mat4 projection;\n" +
                "uniform mat4 transformation;\n" +
                "varying vec4 vColor;\n" +
                "void main(){\n" +
                "   vColor = color;\n" +
                "   gl_Position = projection * transformation * position;\n" +
                "}";

private static final String FRAGMENT_SHADER =
        "#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "varying vec4 vColor;\n" +
                "void main(){\n" +
                "   gl_FragColor = vColor;\n" +
                "}";

private static final float[] vertxs = {
        //0            1
        -1f, -1f, -1f, 1f, -1f, -1f,
        //2            3
        1f,  1f,  -1f, -1f, 1f, -1f,
        //4           5
        -1f, -1f, 1f, 1f, -1f, 1f,
        //6           7
        1f,  1f,  1f, -1f, 1f, 1f,
};

private static Matrix4 projection = new Matrix4();
static{
    final float aspect = Gdx.graphics.getWidth() / (float) Gdx.graphics.getHeight();
    projection.setToProjection(1.0f, 20.0f, 60.0f, aspect);
}

private static final short[] indicies = {
    1, 3, 0, 1, 2, 3, //front
    1, 6, 2, 1, 5, 6, //right
    2, 7, 3, 1, 6, 7, //top
    4, 7, 6, 4, 5, 6, //back
    7, 4, 3, 4, 3, 0, //left
    0, 4, 1, 4, 5, 1  //bottom
};

private static ShaderProgram createProgram() {

    ShaderProgram.pedantic = false;
    final ShaderProgram program = new ShaderProgram(VERTEX_SHADER, FRAGMENT_SHADER);
    final String log = program.getLog();
    if (!program.isCompiled()) {
        System.out.println("Failed to compile Cube Shader Program");
    }
    if (log != null && !log.isEmpty()) {
        System.out.println(log);
    }
    return program;
}

public static final ShaderProgram program = createProgram();


private Mesh mesh;
private Color color;
private Matrix4 transform;

public Cube(final Color color){
    this.color = color;
    mesh = new Mesh(true, 24, 36,
            new VertexAttribute(VertexAttributes.Usage.Position, 3, "position"),
            new VertexAttribute(VertexAttributes.Usage.ColorUnpacked, 3, "color"));
    mesh.setVertices(vertxs).setIndices(indicies);
    mesh.getVertexAttribute(VertexAttributes.Usage.Position).alias = "position";

    transform = new Matrix4();
}

public void addTransform(final Matrix4 additionalTrans){
    transform.mul(additionalTrans);
}

public Matrix4 getTransform(){
    return transform;
}

public Color getColor() {
    return color;
}

public void render(){
    Gdx.gl20.glDepthMask(true);
    Gdx.gl20.glEnable(GL20.GL_BLEND);
    Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_CONSTANT_ALPHA);

    program.begin();
    program.setUniform4fv("projection", projection.getValues(), 0, projection.getValues().length);
    program.setUniform4fv("transformation", transform.getValues(), 0, transform.getValues().length);
    program.setAttributef("color", color.r, color.g, color.b, color.a);
    mesh.render(program, GL20.GL_TRIANGLES);
    program.end();
}

}
以及调用类

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;

public class MeshStudies extends ApplicationAdapter {
private Cube cube;

@Override
public void create() {
    cube = new Cube(Color.BLUE);
}

@Override
public void render() {
    Gdx.gl20.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    Gdx.gl20.glClearColor(0.5f, 0.3f, 0.8f, 1f);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
    cube.render();
}
}
当我运行这段代码时,我得到了一个黑屏,没有任何着色器编译错误或提示

有人能帮我找出哪里出了问题吗?如果任何有经验的LibGDX用户都能告诉我是否有更有效的方法来设计这个程序(在每个多维数据集类中保存转换矩阵是必要的),那就更好了。但是,这段代码是否真的在OpenGL透视图中高效地呈现了每件事


谢谢

您在创建网格时没有指定顶点颜色,这表明您将这样做。所以你需要调整其中一个。也可以调用
Gdx.gl.glClearColor(0.5f、0.3f、0.8f、1f)或类似的内容,否则您根本不知道它是否呈现为黑色。@Xoppa,我已经按照您的建议更改了代码。但仍然不起作用。我还错过了什么?thanksUpdate您的问题相应地,目前它仍然说您想包括一个顶点颜色,但您不包括它。顺便说一句,此示例可能对您有所帮助:。您在创建网格时没有指定顶点颜色,这表明您将这样做。所以你需要调整其中一个。也可以调用
Gdx.gl.glClearColor(0.5f、0.3f、0.8f、1f)或类似的内容,否则您根本不知道它是否呈现为黑色。@Xoppa,我已经按照您的建议更改了代码。但仍然不起作用。我还错过了什么?thanksUpdate您的问题相应地,目前它仍然说您想包括一个顶点颜色,但您不包括它。顺便说一句,此示例可能会帮助您:。