2017-07-06 2 views
0

Bonjour J'essaie de rendre la texture sur deux triangles. glGetError() ne renvoie aucune erreur. Je peux rendre le rectangle coloré, mais la texture ne fonctionne pas. Les shaders sont compilés sans erreurs. Pourquoi ce code ne fonctionne pas? (Image)La texture ne fonctionne pas

class MainRenderer implements GLSurfaceView.Renderer { 
    int vertexBuffer; 
    int indexBuffer; 
    int shaderProgram; 
    int texture; 

    @Override 
    public void onSurfaceCreated(GL10 unused, EGLConfig config) { 
     GLES20.glClearColor(1, 0, 0, 1); 

     int[] textures = new int[1]; 
     GLES20.glGenTextures(1, textures, 0); 
     texture = textures[0]; 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, BitmapFactory.decodeResource(MainActivity.MainActivityHandle.getResources(), R.drawable.pes), 0); 

     float vertices[] = { 
       1, 1, 
       1, 0, 
       0, 0, 
       0, 1 
     }; 
     int indices[] = { 
       0, 1, 3, 
       1, 2, 3 
     }; 
     String vertexShaderCode = "attribute vec2 position; vec2 texturePosition; void main(){texturePosition = position;gl_Position = vec4(position,0.0, 1.0);}"; 
     String fragmentShaderCode = "precision mediump float;uniform sampler2D texture; vec2 texturePosition; void main(){gl_FragColor = texture2D(texture, texturePosition);}"; 

     int vertexBuffers[] = new int[1]; 
     GLES20.glGenBuffers(1, vertexBuffers, 0); 
     vertexBuffer = vertexBuffers[0]; 
     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); 
     GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, 4 * 2 * 4, FloatBuffer.wrap(vertices), GLES20.GL_STATIC_DRAW); 

     int indexBuffers[] = new int[1]; 
     GLES20.glGenBuffers(1, indexBuffers, 0); 
     indexBuffer = indexBuffers[0]; 
     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
     GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 2 * 3 * 4, IntBuffer.wrap(indices), GLES20.GL_STATIC_DRAW); 

     int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); 
     GLES20.glShaderSource(vertexShader, vertexShaderCode); 
     GLES20.glCompileShader(vertexShader); 

     int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); 
     GLES20.glShaderSource(fragmentShader, fragmentShaderCode); 
     GLES20.glCompileShader(fragmentShader); 

     shaderProgram = GLES20.glCreateProgram(); 
     GLES20.glAttachShader(shaderProgram, vertexShader); 
     GLES20.glAttachShader(shaderProgram, fragmentShader); 
     GLES20.glLinkProgram(shaderProgram); 
    } 

    @Override 
    public void onSurfaceChanged(GL10 unused, int width, int height) { 
     GLES20.glViewport(0, 0, width, height); 
    } 

    @Override 
    public void onDrawFrame(GL10 unused) { 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

     GLES20.glUseProgram(shaderProgram); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); 
     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture); 

     int positionAttributeHandle = GLES20.glGetAttribLocation(shaderProgram, "position"); 
     GLES20.glEnableVertexAttribArray(positionAttributeHandle); 
     GLES20.glVertexAttribPointer(positionAttributeHandle, 2, GLES20.GL_FLOAT, false, 2*4, 0); 

     GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_INT, 0); 

     GLES20.glDisableVertexAttribArray(positionAttributeHandle); 
    } 
} 

Répondre

0

Je peux au moins voir que vous utilisez (dans vertex shaders et fragment) juste « vec2 texturePosition », alors que vous devez utiliser un « variable » pour la sortie du vertex shader au fragment shader. Essayez d'ajouter "variable" avant "vec2 ..." dans les shaders.