簡體   English   中英

OpenGL ES glReadPixels返回錯誤的值

[英]OpenGL ES glReadPixels returns wrong values

首先第一次來這里,大家好。 在網上搜尋了包括該站點在內的幾天后,我未能克服此問題:

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 
            }

無論如何,出於拾取目的,每個正方形都以唯一的顏色繪制(當前繪制3個正方形,其顏色分別為99,96和93紅色,藍綠色alpha為0)glReadPixels單擊(99,0,0)或返回(91,0,0)。

如果該框是彩色的(x,0,0,255),它將返回一個值,就好像它具有一個可能的值列表,它們之間有8個空格。 (91,99,107 ..)將每種讀取的顏色值“舍入”到最接近的“可能”值。

幾個月前,我遇到了一個類似的問題,但是我將Bitmap類與getPixel方法一起使用來讀取各個像素的顏色。 作為測試,我使用了全黑的黑色圖像,因此所有像素都應具有值0 ,但是getPixel方法返回的值為0,6,0,6,0,6 ... etc。

如果您在Android SDK的Google代碼頁上查看此鏈接,則其他人會遇到與我相同的問題: Bitmap.getPixel錯誤不幸的是尚未修復。

我不確定它是否與Android上的OpenGL有關,但是根據我的經驗,以后的SDK版本有時會以某種方式弄亂顏色值。 那天唯一有效的方法是使用較低的SDK版本。

在1.4或1.5上嘗試您的代碼,如果問題消失了,請等待更高版本的SDK上的修復。 如果問題仍然存在,那就是另一個問題。

PS:如果您在以后的SDK中找到解決方案,請告訴我。

正如我在這里所說的:

Java沒有帶符號的字節,此實現要求glReadPixels提供“ GL10.GL_UNSIGNED_BYTE”答案。 轉換會損害返回的數據。 (例如95紅色將返回為91或99)。

由於Java無法處理此轉換問題,因此我為該問題提供了兩種解決方案:1)在每兩個可能值(對於一種顏色)和新的絕對值之間建立轉換映射。

2)使用NDK可能會立即給出精確的顏色值。 請記住,我還沒有對其進行測試,因此決定將NDK與OpenGL配合使用時,並不總是比Java提供更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM