2017-07-06 6 views
0

こんにちは私は2つの三角形にテクスチャを描画しようとしています。 glGetError()はエラーを返しません。私は色の矩形をレンダリングすることができますが、テクスチャは機能しません。シェーダはエラーなしでコンパイルされます。なぜこのコードが機能しないのですか?あなたは頂点シェーダからのフラグメントシェーダへの出力は「変」を使用する必要がありながら、私は、少なくとも、あなたは単に「VEC2のtexturePosition」(頂点およびフラグメントシェーダで)を使用していることがわかります(Imageテクスチャが動作しません

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

答えて

0

。シェーダで 'vec2 ...'の前に 'varying'を追加してみてください。

関連する問題