2013-10-09 28 views
0

我在android上使用open gl es顯示用透明顏色替換的黑色視頻。但是當我使用我的特定着色器GL_INVALID_OPERATION錯誤代碼。glDrawArrays爲特定着色器拋出GL_INVALID_OPERATION異常

這裏是我的着色器:

protected final String mFragmentShader = 
       "#extension GL_OES_EGL_image_external : require\n" + 
         "uniform samplerExternalOES sTexture;\n" + 
         "varying vec2 vTextureCoord;\n" + 
         "vec4 color;\n" + 
         "\n" + 
         "void main(){\n" + 
         " color = texture2D(sTexture, vTextureCoord);\n" + 
         " if(color.r < 0.1 && color.g < 0.1 && color.b < 0.1){\n" + 
         "  gl_FragColor = vec4(0.0,0.0,0.0,0.0);\n" + 
         " } else{\n" + 
         "  gl_FragColor = color;\n" + 
         " }\n" + 
         "}"; 

當我下次使用着色器 - 一切都被表現很好(當然除了透明度)

protected final String mFragmentShader = 
       "#extension GL_OES_EGL_image_external : require\n" + 
         "precision mediump float;\n" + 
         "varying vec2 vTextureCoord;\n" + 
         "uniform samplerExternalOES sTexture;\n" + 
         "void main() {\n" + 
         " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + 
         "}\n"; 

這裏是我的onDrawFrame代碼:

public void onDrawFrame(GL10 glUnused) { 
      if(!mMediaPlayer.isPlaying()) 
       return; 
      synchronized (this) { 
       if (updateSurface) { 
        mSurface.updateTexImage(); 
        mSurface.getTransformMatrix(mSTMatrix); 
        updateSurface = false; 
       } 
      } 

      GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 
      GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

      GLES20.glUseProgram(mProgram); 
      checkGlError("glUseProgram"); 

      GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
      GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID); 

      mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); 
      GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 
        TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 
      checkGlError("glVertexAttribPointer maPosition"); 
      GLES20.glEnableVertexAttribArray(maPositionHandle); 
      checkGlError("glEnableVertexAttribArray maPositionHandle"); 

      mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); 
      GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false, 
        TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); 
      checkGlError("glVertexAttribPointer maTextureHandle"); 
      GLES20.glEnableVertexAttribArray(maTextureHandle); 
      checkGlError("glEnableVertexAttribArray maTextureHandle"); 

      Matrix.setIdentityM(mMVPMatrix, 0); 
      GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); 
      GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); 

      GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
      checkGlError("glDrawArrays"); 
      GLES20.glFinish(); 

     } 

可能是什麼問題?

+1

不是OpenGL ES有'glGetShaderInfoLog'嗎?你有沒有檢查着色器信息日誌是否包含有用的東西? – Michael

+0

它不應該是mTriangleVerticesData和mTriangleTextureData嗎? –

回答

1

問題出在浮點精度。當我在第一個着色器中設置precision mediump float時,一切都開始良好工作

-1

在您的第一個着色器中,當您應該使用color.x等時,您正在使用color.rvec4對象是包含成員的對象x,y,z,w

+0

當更改爲x y z時 - 完全不顯示任何內容。請參閱我的答案以解決我的問題 – earsonheart

+0

不,GLSL允許各種類型的成員訪問,如'xyzw','rgba'和'stpq'。你不能混合它們,比如'xgs'(OP不這樣做)。 –