【问题标题】:Texture on mesh doesnt render, just shows black libgdx gl20网格上的纹理不渲染,只显示黑色 libgdx gl20
【发布时间】:2014-09-09 12:46:27
【问题描述】:

编辑—— 我在 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);

drawWorld 在 render() 中被调用

    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();


}

片段.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;
      }

【问题讨论】:

    标签: java opengl libgdx shader


    【解决方案1】:

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

    由于您不是多重纹理,我将替换为 "a_texCoord"。

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

    【讨论】:

    • 我其实一开始并没有这些,但是看到了一些添加数字的例子,所以我想我会试一试。但即使没有数字,它仍然是黑色的。你认为这可能与 setwrap 和 setfilter 有关吗?
    【解决方案2】:

    好的,原来问题出在顶点着色器上 他们从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; 
    }    
    

    【讨论】:

    • 哦,我明白了问题所在。您的网格没有顶点颜色属性,所以a_color 只是黑色,alpha 为零。由于您没有使用颜色,因此您可以从顶点和片段着色器中完全删除 v_color。
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多