OpenGL ES ortamı oluşturma

Android uygulamanızda OpenGL ES ile grafik çizmek üzere bu grafiklere ilişkin bir görünüm kapsayıcısı oluşturmanız gerekir. Bunu yapmanın en kolay yollarından biri hem GLSurfaceView hem de GLSurfaceView.Renderer uygulamaktır. GLSurfaceView, OpenGL ile çizilen grafikler için bir görünüm kapsayıcısıdır ve GLSurfaceView.Renderer bu görünüm içinde çizilenleri kontrol eder. Bu sınıflar hakkında daha fazla bilgi için OpenGL ES geliştirici kılavuzuna bakın.

GLSurfaceView, uygulamanıza OpenGL ES grafiklerini eklemenin yollarından biridir. Tam ekran veya neredeyse tam ekran grafik görünümü için makul bir seçimdir. OpenGL ES grafiklerini düzenlerinin küçük bir kısmına eklemek isteyen geliştiriciler TextureView ürününe göz atmalıdır. Gerçek, "kendin yap" geliştiricileri için SurfaceView kullanarak bir OpenGL ES görünümü oluşturmak da mümkündür. Ancak bu, oldukça fazla ek kod yazılmasını gerektirir.

Bu derste, basit bir uygulama etkinliğinde GLSurfaceView ve GLSurfaceView.Renderer öğelerinin minimum düzeyde uygulanmasını nasıl tamamlayacağınız açıklanmaktadır.

Manifest'te OpenGL ES kullanımını bildirme

Uygulamanızın OpenGL ES 2.0 API'yi kullanabilmesi için aşağıdaki beyanı manifest dosyanıza eklemeniz gerekir:

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

Uygulamanız doku sıkıştırma kullanıyorsa yalnızca uyumlu cihazlara yüklenmesi için hangi sıkıştırma biçimlerini desteklediğini de belirtmeniz gerekir.

<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
<supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />

Doku sıkıştırma biçimleri hakkında daha fazla bilgi için OpenGL geliştirici kılavuzuna bakın.

OpenGL ES grafikleri için etkinlik oluşturma

OpenGL ES kullanan Android uygulamalarının etkinlikleri, kullanıcı arayüzüne sahip diğer tüm uygulamalar gibi etkinliklere sahiptir. Diğer uygulamalardan en önemli farkı, etkinliğinizin düzenine ne yerleştirdiğinizdir. Birçok uygulamada TextView, Button ve ListView kullanabilseniz de OpenGL ES kullanan bir uygulamada da GLSurfaceView ekleyebilirsiniz.

Aşağıdaki kod örneğinde, birincil görünüm olarak GLSurfaceView kullanan bir etkinliğin minimum düzeyde uygulanması gösterilmektedir:

Kotlin

class OpenGLES20Activity : Activity() {

    private lateinit var gLView: GLSurfaceView

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = MyGLSurfaceView(this)
        setContentView(gLView)
    }
}

Java

public class OpenGLES20Activity extends Activity {

    private GLSurfaceView gLView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a GLSurfaceView instance and set it
        // as the ContentView for this Activity.
        gLView = new MyGLSurfaceView(this);
        setContentView(gLView);
    }
}

Not: OpenGL ES 2.0, Android 2.2 (API Düzeyi 8) veya sonraki bir sürümü gerektirir. Bu nedenle Android projenizin bu API veya üstünü hedeflediğinden emin olun.

GLSurfaceView nesnesi oluşturma

GLSurfaceView, OpenGL ES grafikleri çizebileceğiniz özel bir görünümdür. Tek başına pek bir şey yapmaz. Nesnelerin gerçek çizimi, bu görünümde ayarladığınız GLSurfaceView.Renderer öğesi üzerinden kontrol edilir. Aslında bu nesnenin kodu çok ince olduğundan, nesneyi genişletmeyi atlamak ve sadece değiştirilmemiş bir GLSurfaceView örneği oluşturmak cazip gelebilir. Ancak bunu yapmayın. Dokunma etkinliklerini yakalamak için bu sınıfı genişletmeniz gerekir. Bu konu, Dokunmatik etkinlikleri yanıtlama dersinde ele alınmıştır.

GLSurfaceView için gerekli olan temel kod minimumdur. Bu nedenle, hızlı bir uygulama için kodu kullanan etkinlikte yalnızca bir iç sınıf oluşturmak yaygın olarak kullanılır:

Kotlin

import android.content.Context
import android.opengl.GLSurfaceView

class MyGLSurfaceView(context: Context) : GLSurfaceView(context) {

    private val renderer: MyGLRenderer

    init {

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2)

        renderer = MyGLRenderer()

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer)
    }
}

Java

import android.content.Context;
import android.opengl.GLSurfaceView;

class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer renderer;

    public MyGLSurfaceView(Context context){
        super(context);

        // Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        renderer = new MyGLRenderer();

        // Set the Renderer for drawing on the GLSurfaceView
        setRenderer(renderer);
    }
}

GLSurfaceView uygulamanıza ek olarak isteğe bağlı bir diğer seçenek de oluşturma modunu, GLSurfaceView.RENDERMODE_WHEN_DIRTY ayarını kullanarak yalnızca çizim verilerinizde değişiklik olduğunda görünümü çizecek şekilde ayarlamaktır:

Kotlin

// Render the view only when there is a change in the drawing data
renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY

Java

// Render the view only when there is a change in the drawing data
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

Bu ayar, requestRender() çağırana kadar GLSurfaceView karesinin yeniden çizilmesini engeller. Bu örnek uygulama için daha verimli olur.

Oluşturucu sınıfı oluşturma

GLSurfaceView.Renderer sınıfının veya oluşturucunun OpenGL ES kullanan bir uygulama içinde uygulanması, işler ilginç olmaya başlar. Bu sınıf, ilişkilendirildiği GLSurfaceView öğesinde nelerin çizileceğini kontrol eder. GLSurfaceView üzerinde neyin nasıl ve nasıl çizileceğini anlamak için Android sistemi tarafından çağrılan oluşturucuda üç yöntem vardır:

  • onSurfaceCreated(): Görünümün OpenGL ES ortamını ayarlamak için bir kez çağrılır.
  • onDrawFrame(): Görünümün her yeniden çizimi için çağrılır.
  • onSurfaceChanged() - Görünümün geometrisi değişirse (örneğin, cihazın ekran yönü değiştiğinde) çağrılır.

Burada, GLSurfaceView içinde siyah bir arka plan çizmekten başka bir işlevi olmayan çok temel bir OpenGL ES oluşturucu uygulaması gösterilmektedir:

Kotlin

import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10

import android.opengl.GLES20
import android.opengl.GLSurfaceView

class MyGLRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(unused: GL10, config: EGLConfig) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
    }

    override fun onDrawFrame(unused: GL10) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    }

    override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) {
        GLES20.glViewport(0, 0, width, height)
    }
}

Java

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        // Set the background frame color
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

Hepsi bu kadar! Yukarıdaki kod örnekleri, OpenGL kullanarak siyah ekran görüntüleyen basit bir Android uygulaması oluşturur. Bu kod pek ilginç bir şey yapmasa da, bu sınıfları oluşturarak OpenGL ile grafik öğeleri çizmeye başlamak için gereken temeli atmış oldunuz.

Not: OpengGL ES 2.0 API'lerini kullanırken bu yöntemlerde neden GL10 parametresi bulunduğunu merak ediyor olabilirsiniz. Bu yöntem imzaları, Android çerçeve kodunu daha basit tutmak amacıyla 2.0 API'lerinde yalnızca yeniden kullanılır.

OpenGL ES API'lerine aşinaysanız artık uygulamanızda bir OpenGL ES ortamı ayarlayabilmeniz ve grafik çizmeye başlayabilmeniz gerekir. Ancak, OpenGL’yi kullanmaya başlarken biraz daha yardıma ihtiyacınız varsa birkaç ipucu için sonraki derslere geçebilirsiniz.