Java libgdx着色器-尝试设置颜色

Java libgdx着色器-尝试设置颜色,java,opengl,libgdx,shader,opengl-es-2.0,Java,Opengl,Libgdx,Shader,Opengl Es 2.0,我正在LibGDX中使用着色器进行一些初步工作。我试图手动设置颜色,但得到的只是白色 顶点着色器: attribute vec4 a_position; uniform mat4 u_projTrans; void main() { gl_Position = u_projTrans * a_position; gl_PointSize = 10.0; } 片段着色器: void main() { gl_FragColor = vec4(1.0, 0.0, 0.

我正在LibGDX中使用着色器进行一些初步工作。我试图手动设置颜色,但得到的只是白色

顶点着色器:

attribute vec4 a_position;
uniform mat4 u_projTrans;

void main() {
    gl_Position = u_projTrans * a_position;
    gl_PointSize = 10.0;
}   
片段着色器:

void main()
{
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
正如你所看到的,非常简单。有了这个设置,我可以画出形状,但它们总是变成白色。用我的碎片着色器,我希望一切都是红色的

我在libgdx堆栈中遗漏了什么吗?是否有东西被某些libgdx着色器默认值或其他东西覆盖

屏幕输出:

不知何故,您需要将顶点传递给OpenGL,以便LibGDX具有满足此要求的
Mesh
类。我使用的是
SpriteBatch
,它拥有自己的用于绘制的网格

顶点着色器:

attribute vec4 a_position;
uniform mat4 u_projTrans;

void main()
{
   gl_Position =  u_projTrans * a_position;
}
片段着色器:

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP
#endif

void main()
{
  gl_FragColor = vec4(1,0,0,1);
}
ShaderTest

public class ShaderTest extends ApplicationAdapter {

    SpriteBatch spriteBatch;
    Texture texture;
    ShaderProgram shaderProgram;

    @Override
    public void create() {
        spriteBatch=new SpriteBatch();

         shaderProgram=new ShaderProgram(Gdx.files.internal("default.vertex.glsl"),Gdx.files.internal("default.fragment.glsl"));
         shaderProgram.pedantic = false;
         if(shaderProgram.isCompiled()) {
            System.out.println("Compiled Successfully");
            spriteBatch.setShader(shaderProgram);
         }else {
            System.out.println("Some Problem in Shader");
         }

        texture=new Texture("badlogic.jpg");
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,1,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        spriteBatch.begin();
        spriteBatch.draw(texture,100,100);
        spriteBatch.end();
    }

    @Override
    public void dispose() {
        shaderProgram.dispose();
        texture.dispose();
        spriteBatch.dispose();
    }
}
输出为:

编辑

网格什么都不是,它只是一个大的顶点数组,包含OpenGL所需的值,单个顶点可以保存有关
位置
颜色
纹理坐标
,或者我们希望传递给着色器的任何其他信息

根据问题,你们在片段着色器中固定了红色的颜色,所以你们只需要将quard的位置传递给OpenGL

public class QuardTest extends ApplicationAdapter {

    Mesh quard;
    OrthographicCamera cam;
    ShaderProgram shaderProgram;

    private int Idx = 0;
    private float[] verts= new float[4 * 2];

    @Override
    public void create() {

        cam=new OrthographicCamera();
        shaderProgram=new ShaderProgram(Gdx.files.internal("default.vertex.glsl"),Gdx.files.internal("default.fragment.glsl"));
        if(shaderProgram.isCompiled()) {
            System.out.println("Compiled Successfully");
        }else {
            System.out.println("Some Problem in Shader");
        }

        quard =new Mesh(true,4,0,new VertexAttribute(VertexAttributes.Usage.Position, 2, "a_position"));
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(1,1,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        drawRect(100,100,100,100);
        drawRect(250,250,50,50);
    }

    public void drawRect(float x, float y, float width, float height){

        if (Idx ==verts.length) {
            flush();
        }

        verts[Idx++] = x;
        verts[Idx++] = y;

        verts[Idx++] = x + width;
        verts[Idx++] = y;

        verts[Idx++] = x + width;
        verts[Idx++] = y + height;

        verts[Idx++] = x;
        verts[Idx++] = y + height;
    }

    public void flush(){

        if (Idx ==0)
            return;

        quard.setVertices(verts);
        Gdx.gl.glDepthMask(false);
        int vertexCount = (Idx /2);
        cam.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        shaderProgram.begin();
        shaderProgram.setUniformMatrix("u_projTrans", cam.combined);
        quard.render(shaderProgram, GL20.GL_TRIANGLE_FAN, 0, vertexCount);
        shaderProgram.end();
        Gdx.gl.glDepthMask(true);

        Idx =0;
    }
}

如何在代码中使用着色器程序?你说的
是什么意思?我能画形状,是网格吗?我试着在没有网格的情况下画。那可能是不可能的。。。尝试不使用网格来理解较低级别的函数。如果我今天不能得到它,我将在其中放置一个网格。另外,我没有做的一件事是运行ShaderProgram.begin()。当我这样做时,顶点实际上完全消失了。我发现您的代码中没有使用begin(),因此可能不需要使用begin(),或者在启动SpriteBatch时自动使用begin()。不管怎样,谢谢你的指点。是的,我试着不用spritebatch或mesh。但这可能是试图与框架作过多的斗争。谢谢你的提醒!谢谢你关于ShaderProgram.pedantic的小建议。。。我不知道这一点。@ether\u joe我更新了我的答案,请检查,
ShaderProgram。pedantic
只是一个标志,指示属性和制服是否必须始终符合
SpriteBatch
的要求。是的,我现在在我的代码中包含了一个最小网格。我之前使用的是Java FloatBuffer,并将其与glVertexAttribPointer()一起传递,以了解我的级别有多低。有点愚蠢,但我正在遵循一个非libgdx教程,并对它的工作原理感到好奇。网格应该能把我带到那里。再次感谢!