网格和仿射变换上的libgdx纹理渲染

时间:2016-03-28 13:59:23

标签: android opengl-es libgdx mesh affinetransform

我使用libgdx创建虚拟试用版应用程序。我是Java和libgdx的新手,所以我可能在某处错了。

我打算创建一个着色器和一个网格,并在网格上渲染一个纹理(纹理是带有条纹的紫色织物)。然后我计划在网格中对非常小的三角形(剪切,旋转,变换或平移)进行仿射变换,以形成如下所示的衬衫(2D图像)。

我的想法是当三角形变换时,它们会随身携带纹理部分,并修改纹理。

Fabric Shirt

最初,当我尝试在网格上渲染纹理时,它会显示黑色屏幕而不是紫色布料。我的代码:

public class MyAffineTransformation implements ApplicationListener {

Texture img;
String vertexShader;
String fragmentShader;
Mesh mesh;
ShaderProgram shader;

private float[] verts = new float[MAX_VERTS * NUM_COMPONENTS]; //Used to     make triangles
private int idx = 0; //The index position

@Override
public void create() {

    img = new Texture(Gdx.files.internal("fabric.jpg"));
    img.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
    img.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    mesh = new Mesh(true, 3, 3, new VertexAttribute(Usage.Position, POSITION_COMPONENTS, ShaderProgram.POSITION_ATTRIBUTE),
            new VertexAttribute(Usage.TextureCoordinates, 2, ShaderProgram.TEXCOORD_ATTRIBUTE));

    mesh.setVertices(new float[] { -0.5f, -0.5f, 0.5f, -0.5f, 0, 0.5f });
    mesh.setIndices(new short[] { 0, 1, 2 });

    //Shader - vertex and fragment shader are posted below
    vertexShader = Gdx.files.internal("affine.vert").readString();
    fragmentShader = Gdx.files.internal("affine.frag").readString();
    shader = new ShaderProgram(vertexShader, fragmentShader);
}

@Override
public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    Gdx.graphics.getGL20().glEnable(GL20.GL_TEXTURE_2D);
    img.bind();
    mesh.render(shader, GL20.GL_TRIANGLES, 0, 3);
}

我的顶点着色器:

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_texCoords = a_texCoord; 
 gl_Position =  u_projTrans * a_position; 
}  

Fragment Shader:

#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);
}

截至目前,它显示的是黑屏。请帮我在Mesh上渲染纹理。 此外,当发生这种情况时,是否可以对网格中的小三角形进行仿射透射(旋转,平移,缩放,剪切等)以形成2D衬衫。如果我错了,请告诉我。

0 个答案:

没有答案