2011-11-26 12 views
0

まず最初にここにこんにちは皆さん。 このサイトを含む日間ネットを検索した後、私はこの問題を克服するために失敗しました:目的を選ぶために、OpenGL ES glReadPixelsが間違った値を返します

public void onDrawFrame(GL10 gl) { 

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); //load identity 
     GLU.gluLookAt(gl, 0, -5, -25, 0, 0, 0, 0, 2, 0); //set camera 

     if (fingerInput.isClicking()){ 
      /* Color Picking 4 START */ 
      gl.glDisable(GL10.GL_TEXTURE_2D); //turn off texturing, lighting and fog 
      gl.glDisable(GL10.GL_FOG); 
      gl.glDisable(GL10.GL_LIGHTING); 

      while (i<squares.size()){ //draw picking colors 
       squares.get(i).pickingDraw(gl); //note: picking is the same as draw() only with id colors and not textures 
       i++; 
      } 
      i=0; 

      gl.glReadPixels(fingerInput.getStart().x, screen_height-fingerInput.getStart().y, 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixels); //read what was the color id pressed, store it in 'pixels' (a 4 slots array buffer) 

      Log.d("tlog","at coords: ("+(screen_height-fingerInput.getStart().x)+", "+(screen_height-fingerInput.getStart().y)+")"); 

      for (j=0; j<4; j++){ 
       RGBA[j] = (int)(pixels.get(j) & 0xff); 
       if (RGBA[j] < 0) RGBA[j]+=256; //correcting error caused by java using unsigned bytes and opengl singed bytes 
      } 

とにかく、四角は、(現在のカラー99,96と3つの正方形を描く独特の色でそれぞれに描かれています93赤、0青緑アルファ) glReadPixelsは、(99,0,0)または(91,0,0)のいずれかをクリックして戻る。

ボックスが色付きの場合(x、0,0,255)、可能な値のリストがあたかも8個のスペースがあるかのように値を返します。 (91,99,107 ..)は、読み込まれた各色の値を最も近い「可能な」値に「丸め」ます。

答えて

0

私はここで述べたように:

Javaは何の署名バイトを持っていないし、この実装はglReadPixelsから「GL10.GL_UNSIGNED_BYTE」の答えを求めています。変換によって返されるデータが傷つきます。 (たとえば、赤95は91または99として返されます)。 1)一色のための各2つの可能な値()と新しい絶対値との間の変換マップの作成:Javaはこの変換の問題に対処することができないので

iが問題のために参照二つの溶液があります。

2)NDKを使用すると、すぐに正確なカラー値が得られます。私はそれをテストしていないことを念頭に置いて、OpenGLでNDKを使用することを決めることは、Javaよりも常に良いパフォーマンスを与えるとは限りません。

1

私は数ヶ月前に同様の問題に遭遇しましたが、getPixelメソッドでBitmapクラスを使用して個々のピクセルの色を読み取っていました。テストとして私はすべてのピクセルが値0を持っているはずなので、黒い画像を使用しましたが、getPixelメソッドは値0,6,0,6,0,6 ...などを返していました。

Android SDKのGoogleコードページのこのリンクをご覧になると、他の誰かが私と同じ問題を抱えています: Bitmap.getPixel error残念ながらまだ修正されていません。

Android上でOpenGLと何か関係がありますが、私の経験に基づいて、後のSDKバージョンでは色の値がどうにか混乱することがあります。その日には、より低いバージョンのSDKを使用していたのは唯一のことでした。

1.4または1.5でコードを試してください。問題が解消された場合は、後のSDKの修正を待ちます。それが続くなら、それは別の問題です。

PS:これ以降のSDKで解決策が見つかったら、教えてください。

+0

1.5でプロジェクト全体を再作成しましたが、残念ながら変更はありませんでした。 –

+0

OK、progress .. Javaには符号付きバイトがありません。この実装では、glReadPixelsからの "GL10.GL_UNSIGNED_BYTE"応答が必要です。変換によって返されるデータが傷つきます。 (たとえば、赤95は91または99として返されます)。新しい問題は、なぜGL10.GL_FLOATフラグを使用できないのですか?そのような試みは0値しか返しません。誰かが別の投稿でOpenGL es1.1が浮動小数点を返す2つの状態しか許さないと書きました。どのように人々は、OGLES1.1でglReadPixelsから正確な読み取りを得るのですか?android –

+0

こんにちは、それはアンドロイドで壊れていますか?これに対する解決策はありますか? – lacas

関連する問題