网格上的纹理不会渲染,只显示黑色libgdx gl20

时间:2014-09-09 12:46:28

标签: java opengl libgdx shader

edit-- 我在TenFour04s回答后更新了我的代码但仍显示黑色。

我已经更新了我的libgdx,它要求我使用gl20,这导致我做了一些改动 除了在尝试对网格进行纹理处理时,大多数工作正常。这当前将表面网格显示为黑色,并且根本不显示地面网格。通过一些更改,我可以将它显示为黑色的表面和地面网格。

我已经玩过绑定和surTexture.bind和grdTexture.bind的顺序并且使用小于16的数字并且渲染并且我已经使用表面纹理作为除了表面和地面之外的所有内容的纹理

任何人都可以看到我可能出错的地方吗?

// creating a mesh with maxVertices set to vertices,size*3
            groundMesh = new Mesh(true, vertices.size*3, vertices.size*3, 
                        new VertexAttribute(Usage.Position,2,ShaderProgram.POSITION_ATTRIBUTE),
                        new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE));

            groundMesh.setVertices(temp);

            short[] indices = new short[vertices.size*2];
            for(int i=0;i<vertices.size*2;i++){
                indices[i] = (short)i;
            }
            groundMesh.setIndices(indices);


    surfaceMesh = new Mesh(true, vertices.size*3, vertices.size*3, 
                        new VertexAttribute(Usage.Position,3,ShaderProgram.POSITION_ATTRIBUTE),
                        new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE));    

...

         grdTexture = new Texture(Gdx.files.internal("data/img/leveltest/ground.png"));
        // Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE16);
        //says that setWrap and SetFilter bind the texture so I thought I might have to set         
        //activetexture here but does nothing.
         grdTexture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
         grdTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);


         surTexture = new Texture(Gdx.files.internal("data/img/leveltest/surface.png"));
        // Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE17);
         surTexture.setWrap(TextureWrap.Repeat, TextureWrap.ClampToEdge);
         //TODO change these filters for better quality
         surTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

在render()

中调用drawWorld
    public  void drawWorld(SpriteBatch batch,OrthographicCamera camera) {


    batch.begin();

    batch.setProjectionMatrix(camera.combined);

    layers.drawLayers(batch);




    if ((spatials != null) && (spatials.size > 0)){
         for (int i = 0; i < spatials.size; i++){
            spatials.get(i).render(batch);
         }
     }

    batch.end();
drawGround(camera);

}

    private void drawGround(OrthographicCamera camera){


    shader.begin();
    shader.setUniformMatrix("u_projTrans", camera.combined);

    grdTexture.bind(0);
    shader.setUniformi("u_texture", 0);
    //changed GL_TRIANGLES to GL_TRIANGLE_STRIP to render meshes correctly after changing to GL20
    groundMesh.render(shader, GL20.GL_TRIANGLE_STRIP);

    surTexture.bind(0);
    shader.setUniformi("u_texture", 0);
    surfaceMesh.render(shader, GL20.GL_TRIANGLE_STRIP);
    shader.end();


}

fragment.glsl

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

      varying LOWP vec4 v_color;
     varying vec2 v_texCoords;

     uniform sampler2D u_texture;


     void main()
      {
      gl_FragColor = v_color * texture2D(u_texture, v_texCoords);
       }

vertex.glsl

      attribute vec4 a_position;
      attribute vec4 a_color;
      attribute vec2 a_texCoord;

      uniform mat4 u_projTrans;

      varying vec4 v_color;
      varying vec2 v_texCoords;

      void main() {
      v_color = a_color;
      v_color.a = v_color.a * (256.0/255.0);
      v_texCoords = a_texCoord;
      gl_Position = u_projTrans * a_position;
      }

2 个答案:

答案 0 :(得分:0)

在您的顶点着色器中,您使用的是a_texCoord,但在您的网格构建器中,您已使用a_texCoord16和{{a_texCoord17和{{{{}}}有效地命名了属性ShaderProgram.TEXCOORD_ATTRIBUTE+"16"ShaderProgram.TEXCOORD_ATTRIBUTE+"17" 1}}。

由于您不是多纹理,我只需用"a_texCoord"替换它们。

看起来你可能正在将属性名称后缀与什么纹理单元混淆,尽管这两个概念不一定相关。你可能想要为你的texCoords添加数字后缀的原因是你的网格对于每个顶点都有多个UV,因为它是多重纹理的。但实际上你可以使用你喜欢的任何命名方案。您可能希望绑定到0以外的单位的原因是,如果您在单个网格上进行多纹理处理,则需要同时绑定多个纹理。因此,如果您实际上是多纹理,使用与纹理单元编号匹配的属性后缀可能有助于避免在您尝试将UV与片段着色器中的纹理匹配时产生混淆。

答案 1 :(得分:0)

好的,事实证明问题是顶点着色器 来自here的代码无效。

这是工作着色器

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord;

uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;


void main() {         

     v_color = vec4(1, 1, 1, 1);

     v_texCoords = a_texCoord; 
     gl_Position =  u_projTrans * a_position; 
}