Comment se débarrasser des bords Crénelés dans Android OpenGL ES?
J'ai le code suivant:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LEQUAL);
//gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
gl.glHint(GL10.GL_POLYGON_SMOOTH_HINT, GL10.GL_NICEST);
}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
Mais encore les bords sont fortement crénelés dans Émulateur Android. Quelle est la solution?
OriginalL'auteur ace | 2011-02-08
Vous devez vous connecter pour publier un commentaire.
Le meilleur moyen est d'utiliser le Multisampling ( anti-aliasing ). Puisque vous utilisez l'émulateur, ce n'est pas une option pour vous. ( Multismapling pris en charge OpenGL ES 2.0, mais l'émulateur ne prend pas en charge 2.0 )
Selon la spécification OpenGL, l'appareil peut ignorer la glHint vous définissez, donc ne vous attendez pas à grand-chose.
Le GL_DITHER est une façon de "faux" 24 bits de profondeur de couleur de 16 bits de profondeur de couleur fondamentalement, il n'a rien à voir avec les bords.
Bien que il y est une vieille méthode de "faux" antialiasing, même que je ne l'ai jamais utilisé donc je ne peux pas vous dire comment, mais vous pouvez trouver quelques indices sur le web.
De OpenGL docs
Pour info, Une approche permettant d'échantillonnage multiple, qui ne nécessite pas d'écrire des shaders comme dans thakis réponse peut être trouvée dans svdree la réponse ici stackoverflow.com/a/7388176/199364 Dans mon commentaire j'y ai un lien pour un exemple de code qui ressemble, il utilise son approche.
OriginalL'auteur Drakk Lord
http://code.google.com/p/gdc2011-android-opengl/ a un exemple de code pour le multisampling.
L'archive est ici: code.google.com/archive/p/gdc2011-android-opengl/source/default/...
OriginalL'auteur thakis
Vous tournez sur le lissage de polygone à l'aide d'un "soupçon". Un indice est qu'une "astuce" pour la mise en œuvre que vous souhaitez les bords du polygone et lissée. La mise en œuvre est libre de l'ignorer s'il veut.
C'est exactement ce qu'il fait.
En outre, il est très probable que vous simplement ne pouvez pas activer l'anti-aliasing sur les appareils android, car ils sont tout simplement pas assez puissant pour le faire. Cela peut être différent entre les combinés, mais, encore une fois, vous êtes à la définition d'un indice.
Vous pouvez toujours faux anti-aliasing par le rendu d'un tampon de deux fois la largeur (ou hauteur ou les deux) et puis renderit à l'arrière-plan avec bi-linéaire pour obtenir de l'anti-aliasing, mais je ne suis pas au courant d'un moyen de faire de l'anti-aliasing activé sur Android...
Je suis toujours occupé à travailler sur d'autres questions en OpenGl et écrire en arrière une fois que j'ai testé les conseils décrits ici.
OriginalL'auteur Goz
Je suis juste allé à travers les mêmes problèmes que vous. Je pense que ce que vous cherchez est la ligne de code suivante:
OriginalL'auteur Brenton
gl.glEnable(GL10.GL_DITHER);
. Je ne sais pas si c'est activé par défaut. Aussi: cela rend le dessin plus lent.OriginalL'auteur Pedro Loureiro