Opengl 我的网格没有渲染,但一切看起来都很好

Opengl 我的网格没有渲染,但一切看起来都很好,opengl,libgdx,Opengl,Libgdx,没有日志,没有堆栈跟踪,只有没有渲染的Libgdx网格。我在spriteBatch上测试了着色器,效果很好。网格只是不做任何与渲染方法,甚至没有图形错误。。。你知道问题是什么吗 以下是渲染代码: Gdx.gl20.glClearColor(0f, 0f, 0f, 1f); Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT); Gdx.gl20.glEnable(GL20.GL_BLEND); Gdx.gl20.glEnable(G

没有日志,没有堆栈跟踪,只有没有渲染的Libgdx网格。我在spriteBatch上测试了着色器,效果很好。网格只是不做任何与渲染方法,甚至没有图形错误。。。你知道问题是什么吗

以下是渲染代码:

    Gdx.gl20.glClearColor(0f, 0f, 0f, 1f);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
    Gdx.gl20.glEnable(GL20.GL_BLEND);
    Gdx.gl20.glEnable(GL20.GL_TEXTURE_2D);
    Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

    Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
    this.getDisplayTexture().bind();
    ShipManager.ShipShader.begin();
    ShipManager.ShipShader.setUniformi("u_mode", -4);
    ShipManager.ShipShader.setUniformi("u_texture", 0);
    ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
    m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
    ShipManager.ShipShader.end();
我使用的着色器使用基本的passTour着色器和此片段着色器:

varying vec4 vColor;
varying vec2 vTexCoord0;

uniform sampler2D u_texture;
uniform int u_mode;

void main()
{
vec4 col = vec4(1, 0, 0.682,1);
if (u_mode == -4){
    col = vec4(vTexCoord0.xy,0.,1.);
}
if (u_mode == -3){
    col = vec4(0.);
}
if (u_mode == -2){
    col = vec4(0.,0.,0.,1.);
}
if (u_mode == -1){
    col = vec4(1.);
}
if (u_mode == 0){
    col = vec4(vColor.rgb,1);
}
if(u_mode == 1){
    col = texture2D(u_texture, vTexCoord0);
}

gl_FragColor = col;

}
对于MakeMeshGrid方法,我使用MeshBuilder:

public static Mesh MakeMeshGid(Vector2 center,int width,int height,Shipsel[][] data){

    MeshBuilder meshBuilder = new MeshBuilder();
    meshBuilder.begin(Usage.Position | Usage.TextureCoordinates | Usage.ColorPacked);
    for (Shipsel[]sh:data){
        for (Shipsel s:sh){
            if (s!= null){
                meshBuilder.part(s.getX()+":"+s.getY(), GL20.GL_TRIANGLES);
                meshBuilder.setColor(Color.WHITE);
                Vector3[] bounds = getShipselBounds(width,height,s,center);
                Vector2[] uvs = getUVs(width,height,s);
                MeshPartBuilder.VertexInfo v1 = new MeshPartBuilder.VertexInfo().setPos(bounds[0]).setCol(null).setUV(uvs[0]);
                MeshPartBuilder.VertexInfo v2 = new MeshPartBuilder.VertexInfo().setPos(bounds[1]).setCol(null).setUV(uvs[1]);
                MeshPartBuilder.VertexInfo v3 = new MeshPartBuilder.VertexInfo().setPos(bounds[2]).setCol(null).setUV(uvs[2]);
                MeshPartBuilder.VertexInfo v4 = new MeshPartBuilder.VertexInfo().setPos(bounds[3]).setCol(null).setUV(uvs[3]);
                meshBuilder.rect(v1, v2, v3, v4);
            }
        }
    }
    Mesh mesh = meshBuilder.end();

    return mesh;

}

private static Vector3[] getShipselBounds(int w,int h,Shipsel s, Vector2 center) {

    Vector3[] bounds = new Vector3[4];

    bounds[0] = new Vector3(0.5f, 0.5f,0).add(s.getX() - w / 2,
            s.getY() - h / 2,0).add(center.x,center.y,0);
    bounds[1] = new Vector3(-0.5f, 0.5f,0).add(s.getX() - w / 2,
            s.getY() - h / 2,0).add(center.x,center.y,0);
    bounds[2] = new Vector3(-0.5f, -0.5f,0).add(s.getX() - w / 2,
            s.getY() - h / 2,0).add(center.x,center.y,0);
    bounds[3] = new Vector3(0.5f, -0.5f,0).add(s.getX() - w / 2,
            s.getY() - h / 2,0).add(center.x,center.y,0);

    return bounds;

}

private static Vector2[] getUVs(int w,int h,Shipsel s) {

    Vector2[] uvs = new Vector2[4];

    uvs[0] = new Vector2((s.getX() + 1) / (w + 1), (s.getY() + 1) / (h + 1));
    uvs[1] = new Vector2((s.getX()) / (w + 1), (s.getY() + 1) / (h + 1));
    uvs[2] = new Vector2((s.getX()) / (w + 1), (s.getY()) / (h + 1));
    uvs[3] = new Vector2((s.getX() + 1) / (w + 1), (s.getY()) / (h + 1));

    return uvs;

}
至少给我一个暗示或类似的东西

更新:

当我四处修补时,我得到了一些东西来渲染,但它的工作非常精巧,只不过是这样:

    Mesh m = ShipMesh.MakeMeshGid(center,w,h,shipsels);
    this.getDisplayTexture().bind();
    ShipManager.ShipShader.begin();
    ShipManager.ShipShader.setUniformi("u_mode", -4);
    ShipManager.ShipShader.setUniformi("u_texture", 0);
    ShipManager.ShipShader.setUniformMatrix(0, cam.combined);
    m.render(ShipManager.ShipShader, GL20.GL_TRIANGLES);
    ShipManager.ShipShader.end();

    m.dispose();

    ShipManager.ShipShader.begin();
    ShipManager.ShipShader.setUniformi("u_mode", 1);
    ShipManager.ShipShader.end();
    Texture tex = getDisplayTexture();
    Batch b = new SpriteBatch();
    b.setShader(ShipManager.ShipShader);
    b.setProjectionMatrix(cam.combined);
    Vector2 o = new Vector2(center);
    o.sub(matMap.getWidth()/2, matMap.getHeight()/2);
    b.begin();
    b.draw(tex, o.x, o.y,matMap.getWidth(),matMap.getHeight());
    b.end();
    b.dispose();
在这种格式中,所有其他内容都像以前一样,它以黑色绘制网格,如果我删除Spritebatch部分,它将不起作用

它应该绘制纹理坐标,而不是纯黑色


我想我遗漏了SpriteBatch中包含的一些内容。


因此我发现这是一个愚蠢的转换错误,它正在干扰UV。UV处理整数而不是浮点数。对于未渲染的网格,调用
Gdx.gl.glDepthMask(true)
mesh.render()之后解决了使用sprite批次解决的问题:)


我希望它有帮助:)。

这不应该分配给某个变量而不是0吗<代码>ShipManager.ShipShader.setUniformMatrix(0,cam.combined)不,它是正确的,它将矩阵设置为它在着色器程序中找到的第一个矩阵。不,它没有。它可能会意外地为您的测试设置工作,但它肯定不会设置“它找到的第一个矩阵”。好的,但无论如何,它现在工作得很好,我发布了解决问题的方法:)我也将矩阵设置为名称,所以不用担心:)