Autor Wątek: [Java+Opengl] Color picking  (Przeczytany 2996 razy)

Offline Tinekk

  • Użytkownik

# Listopad 28, 2012, 01:02:38
Witam, staram się zaimplementować sobie color picking w mojej appce. W sumie cały kod skopiowałem z c++'owej wersji i lekko przerobiłem. Niestety wystąpił pewien nie zrozumiały dla mnie problem.

ByteBuffer bb = ByteBuffer.allocate(4);
gl.glReadPixels((int)touchX,  ((int)SCREEN_HEIGHT - (int)touchY), 1, 1, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);
int r = (pixel.get(0) & 0xFF);
int g = (pixel.get(1) & 0xFF);
int b = (pixel.get(2) & 0xFF);
gl.glColor4f(222.0f/255.0f,222.0f/255.0f,222.0f/255.0f,(uniqueID>=0)?1.0f:0.0f);
r=222
g=223!!!!!!!!!!
b=222

Dlaczego tak dziwnie zaokrągla? Jak to poprawnie napisać?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Listopad 28, 2012, 10:03:34
Wyłącz antyaliasing podczas przebiegu z rysowaniem kolorów.

Upewnij się, że masz framebuffer 32bpp.

Offline Tinekk

  • Użytkownik

# Listopad 28, 2012, 14:06:26
Zmiana formatu nie pomaga
getHolder().setFormat(PixelFormat.RGBA_8888);AA wyłączone - chyba że jakoś domyślnie się włącza.
Zakomentowanie Shadowania też nie pomaga.
//gl.glShadeModel(GL10.GL_SMOOTH);

Offline Kos

  • Użytkownik
    • kos.gd

# Listopad 28, 2012, 14:14:58
"Zakomentowanie" nie ma znaczenia samo w sobie, chyba, że w innym miejscu programu przestawiasz to na GL_FLAT.

Wyłączyłeś oświetlenie, teksturowanie, mgłę, blending? (Jak potrzebujesz odrzucania pikseli wg alphy, to zamiast blendingu włącz alpha test.)

edit -> Spróbuj też zamiast glColor4f dać glColor4ub(222, 222, 222, whatever).
« Ostatnia zmiana: Listopad 28, 2012, 14:17:58 wysłana przez Kos »

Offline Tinekk

  • Użytkownik

# Listopad 28, 2012, 16:51:22
Myślałem że jest oczywistością to że nie ma mgły świateł teksturowania.
gl.glColor4x(222, 222, 222, 255);po odczytywaniu takich wartości wychodzą rgb=~8,4,0
glColor4ub nie posiadam w swoim openglu.
Blending jest tutaj tylko on/off żeby wyłączyć kolizje niektórych więc jest 1.0f / 0.0f więc wątpie żeby to on bruździł - zresztą..... teraz własnie sprawdziłem że nawet nie jest włączony blending do tego testu.

Offline Kos

  • Użytkownik
    • kos.gd

  • +1
# Listopad 28, 2012, 17:19:25
Myślałem że jest oczywistością to że nie ma mgły świateł teksturowania.
Od myślenia głowa nie boli :-)

Cytuj
glColor4ub nie posiadam w swoim openglu.
Nie wiem, co to jest "Twój opengl", ale tu masz refkę z jogl:
http://download.java.net/media/jogl/jogl-2.x-docs/javax/media/opengl/GL2ES1.html#glColor4ub(byte, byte, byte, byte)

glColor4x jest z OpenGL ES 1.

Odpal tak z ciekawości glGetIntegerv(GL_RED_BITS, ...) oraz GL_GREEN_BITS i GL_BLUE_BITS, upewnij się czy na 100% masz tam wszędzie tyle ile chcemy.
Powiedz też, jaką masz wersję kontekstu ( glGetString(GL_VERSION)).

Offline Kos

  • Użytkownik
    • kos.gd

  • +1
# Listopad 28, 2012, 18:06:44
Aha: magluję Cię o format framebuffera, bo kiedyś był popularny format 16-bitowy R5G6B5 - a u Ciebie to zielony kolor się rozjeżdża, więc kto wie?

Offline Tinekk

  • Użytkownik

# Listopad 28, 2012, 19:27:55
No widzisz, jednak się nie zmienia na 8888, jest 565,

        super(context);
        mRenderer = new OpenGLRenderer(gla,context);
        getHolder().setFormat(PixelFormat.RGBA_8888);
        setEGLConfigChooser(true);
        setRenderer(mRenderer);

W takim razie, gdzie jest niepoprawnosc w tym kodzie?

@edit
OpenGL ES-CM 1.0
« Ostatnia zmiana: Listopad 28, 2012, 19:35:54 wysłana przez Tinekk »

Offline Avaj

  • Użytkownik

  • +1
# Listopad 28, 2012, 20:28:28
strzelam, że zmiana formatu musi nastąpić przed utworzeniem OpenGLRenderera/kontekstu

Offline Tinekk

  • Użytkownik

# Listopad 28, 2012, 20:44:23
To chyba nie to

public class GLActivity extends Activity
{
GLSurfaceView mGLView;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().setFormat(PixelFormat.RGBA_8888);
(....)

bez różnicy wywołanie funkcji przed
   mRenderer = new OpenGLRenderer(gla,context);
także nic nie zmienia.


@edit
cytat z stackoverflow (goście piszą że działa)
Cytuj
Alternatively you can set your window to be 32bpp with the following line added to your activity's onCreate(), between super.onCreate() and setContentView(). :
    getWindow().setFormat(PixelFormat.RGBA_8888);

Jednak u mnie dalej nie.... (nie zmienia formatu)

@edit2 - rozwiązanie

setEGLConfigChooser(8, 8, 8, 8, 16, 0);
« Ostatnia zmiana: Listopad 28, 2012, 23:22:47 wysłana przez Tinekk »