OpenGL ES ortamı oluşturma

Android uygulamanızda OpenGL ES ile grafik çizmek için bir kapsayıcıyı otomatik olarak görüntülemesini sağlar. Bunu yapmanın daha basit yollarından biri, hem GLSurfaceView ve GLSurfaceView.Renderer. CEVAP GLSurfaceView, OpenGL ile çizilen grafiklere ve GLSurfaceView.Renderer, bu görünüm içinde nelerin çizileceğini kontrol eder. Okuyucu Gelirleri Yöneticisi'ni daha fazla bilgi için OpenGL ES geliştirici kılavuzuna.

GLSurfaceView, OpenGL ES grafiklerini öğelerinize eklemenin bir uygulamadır. 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 bölümüne dahil etmek isteyen geliştiriciler, TextureView göz atın. Kendin yap geliştiricileri için de SurfaceView kullanarak bir OpenGL ES görünümü oluşturmak mümkündür, ancak bu, kod yazmaya başladım.

Bu derste, GLSurfaceView ve GLSurfaceView.Renderer uygulamalarını basit bir şekilde minimum düzeyde nasıl uygulayabileceğiniz açıklanmaktadır. olabilir.

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

Uygulamanızın OpenGL ES 2.0 API'yi kullanması için aşağıdakileri eklemeniz gerekir: beyana ekleyin:

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

Uygulamanız doku sıkıştırması kullanıyorsa hangi sıkıştırma biçimlerini de bildirmeniz gerekir yalnızca uyumlu cihazlara yüklenecek şekilde destekler.

<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ılavuzu.

OpenGL ES grafikleri için bir etkinlik oluşturun

OpenGL ES kullanan Android uygulamaları, kullanıcı arayüzü. Diğer uygulamalardan temel farkı, uygulamalarınızın düzenini etkinliği'ne dokunun. Birçok uygulamada TextView, Button ve ListView özelliklerini kullansanız da OpenGL ES kullanan bir uygulamada bir GLSurfaceView ekleyin.

Aşağıdaki kod örneğinde, Birincil görünüm olarak GLSurfaceView:

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 sürümleri gerektirir. Bu nedenle, Android projenizin bu API'yi veya üstünü hedeflediğinden emin olun.

GLSurfaceView nesnesi oluşturma

GLSurfaceView, OpenGL ES çizebileceğiniz özel bir görünümdür gösterir. Kendi başına pek bir şey sağlamaz. Nesnelerin gerçek çizimi Bu görünümde ayarladığınız GLSurfaceView.Renderer. Hatta bunun kodu çok ince olduğu için genişletmeyi atlamak ve değiştirilmemiş bir resim oluşturmak GLSurfaceView örneğini alır, ancak bunu yapmayın. Bu dersi şu kadar uzatmanız gerekiyor: Dokunmaya yanıt verme bölümünde ele alınan dokunma etkinliklerini yakalamak için etkinlikleri dersini inceleyin.

Bir GLSurfaceView için gerekli kod minimum düzeyde olduğundan hızlıca yaygın proje yönetimi Bunu kullanan etkinlikte bir iç sınıf oluşturmanız yeterlidir:

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 diğer isteğe bağlı eklemelerden biri de öğesini kullanarak görünümü yalnızca çizim verilerinizde değişiklik olduğunda çizmek için GLSurfaceView.RENDERMODE_WHEN_DIRTY ayar:

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, siz alana kadar GLSurfaceView karesinin yeniden çizilmesini önler requestRender() numaralı telefonu ara, yani daha fazlası verimli olmasını sağlar.

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

GLSurfaceView.Renderer sınıfının veya oluşturucunun uygulanması, geliştiren diğer bir uygulama da ilginçleşmeye başlıyor. Bu sınıf kontroller ilişkili olduğu GLSurfaceView üzerinde nelerin çizildiğini gösterir. Her biri 100'den az gösterim alan oluşturmak için hangi üç yöntem kullanılır? GLSurfaceView üzerinde nasıl çizim yapılır?

  • onSurfaceCreated() - Görünümün OpenGL ES ortamını ayarlamak için bir kez çağrılır.
  • onDrawFrame() - Her biri için çağrıldı yeniden çizebilirsiniz.
  • onSurfaceChanged() - Şu durumda aranır: Örneğin, cihazın ekran yönü değiştiğinde görünümün geometrisi değişir.

Burada, bir OpenGL ES oluşturucunun çok temel bir uygulamasını görebilirsiniz. Bu uygulama, yalnızca bir GLSurfaceView içinde siyah arka plan:

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, aşağıdaki gibi basit bir Android uygulaması oluşturur: OpenGL kullanarak siyah bir ekran görüntüler. Bu kod çok ilginç bir şey yapmasa da grafik öğeleri çizmeye başlamak için ihtiyacınız olan temeli atmış OpenGL'ye dokunun.

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çevesi kodunu korumak amacıyla 2.0 API'leri için tekrar kullanılır. daha basit hale getirir.

OpenGL ES API'leri hakkında bilginiz varsa, artık bir OpenGL ES kurulumu gerçekleştirebilmeniz gerekir. ve grafikler çizmeye başlayın. Ancak, projenizi planlarken OpenGL ile başlayıp birkaç ipucu daha için sonraki derslere geçin.