สร้างสภาพแวดล้อม OpenGL ES

ในการวาดกราฟิกด้วย OpenGL ES ในแอปพลิเคชัน Android คุณต้องสร้าง ดูคอนเทนเนอร์สำหรับคนกลุ่มนี้ วิธีที่ชัดเจนที่สุดวิธีหนึ่งคือการใช้ทั้ง GLSurfaceView และ GLSurfaceView.RendererGLSurfaceView เป็นคอนเทนเนอร์มุมมองสำหรับกราฟิกที่วาดด้วย OpenGL และ GLSurfaceView.Renderer จะควบคุมสิ่งที่วาดภายในมุมมองนั้น หากต้องการดูข้อมูลเพิ่มเติม เกี่ยวกับชั้นเรียนเหล่านี้ โปรดดู OpenGL ES คู่มือนักพัฒนาซอฟต์แวร์

GLSurfaceView เป็นเพียงวิธีหนึ่งในการรวมกราฟิก OpenGL ES แอปพลิเคชัน สำหรับมุมมองกราฟิกแบบเต็มหน้าจอหรือเกือบเต็ม ถือว่าเป็นตัวเลือกที่สมเหตุสมผล นักพัฒนาซอฟต์แวร์ที่ต้องการใช้กราฟิก OpenGL ES ในเลย์เอาต์เพียงเล็กน้อยควร โปรดดูที่ TextureView สำหรับนักพัฒนาซอฟต์แวร์จริงที่ทำด้วยตนเองได้ สามารถสร้างมุมมอง OpenGL ES โดยใช้ SurfaceView ได้ แต่ต้อง การเขียนโค้ดเพิ่มเติมเล็กน้อย

บทเรียนนี้อธิบายวิธีติดตั้งใช้งาน GLSurfaceView และ GLSurfaceView.Renderer ให้น้อยที่สุดในง่ายๆ กิจกรรมของแอปพลิเคชัน

ประกาศการใช้ OpenGL ES ในไฟล์ Manifest

เพื่อให้แอปพลิเคชันของคุณใช้ OpenGL ES 2.0 API ได้ คุณต้องเพิ่มสิ่งต่อไปนี้ ประกาศไปยังไฟล์ Manifest

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

หากแอปพลิเคชันของคุณใช้การบีบอัดพื้นผิว คุณต้องประกาศด้วยว่ารูปแบบการบีบอัดใด ที่แอปของคุณรองรับ ดังนั้น แอปจึงติดตั้งในอุปกรณ์ที่ใช้งานร่วมกันได้เท่านั้น

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการบีบอัดพื้นผิว โปรดดู คู่มือนักพัฒนาซอฟต์แวร์ OpenGL

สร้างกิจกรรมสำหรับกราฟิก OpenGL ES

แอปพลิเคชัน Android ที่ใช้ OpenGL ES จะมีกิจกรรมเหมือนกับแอปพลิเคชันอื่นๆ ที่มี อินเทอร์เฟซผู้ใช้ ความแตกต่างที่สำคัญจากแอปพลิเคชันอื่นๆ คือสิ่งที่คุณ จัดวางไว้ในการจัดวางสำหรับ กิจกรรม แม้ว่าในหลายๆ แอปพลิเคชันคุณอาจใช้ TextView, Button และ ListView แต่ในแอปที่ใช้ OpenGL ES คุณจะทำสิ่งต่อไปนี้ได้ เพิ่ม GLSurfaceView ด้วย

ตัวอย่างโค้ดต่อไปนี้แสดงการใช้งานกิจกรรมที่ใช้องค์ประกอบ 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);
    }
}

หมายเหตุ: OpenGL ES 2.0 ต้องใช้ Android 2.2 (API ระดับ 8) ขึ้นไป ดังนั้นอย่าลืมกำหนดเป้าหมายเป็น API สำหรับโปรเจ็กต์ Android ขึ้นไป

สร้างออบเจ็กต์ GLSurfaceView

GLSurfaceView คือมุมมองพิเศษที่คุณสามารถวาด OpenGL ES ได้ กราฟิก โดยไม่ต้องทำอะไรมาก การวาดของวัตถุที่แท้จริงจะควบคุมใน GLSurfaceView.Renderer ที่คุณตั้งไว้ในข้อมูลพร็อพเพอร์ตี้นี้ อันที่จริง โค้ดสำหรับ ของวัตถุบางชิ้น คุณอาจจะอยากข้ามการขยายไป แล้วสร้างสิ่งที่ไม่มีการปรับเปลี่ยน GLSurfaceView แต่ไม่สามารถทำได้ คุณต้องขยายชั้นเรียนนี้ในอีก เพื่อจับภาพกิจกรรมการสัมผัส ซึ่งระบุไว้ในส่วนตอบสนองต่อการแตะ กิจกรรม

รหัสที่จำเป็นสำหรับ GLSurfaceView นั้นมีขนาดเล็ก ดังนั้นสำหรับ โดยปกติแล้วจะ เพียงสร้างชั้นเรียนภายในกิจกรรมที่ใช้กลุ่ม

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);
    }
}

ตัวเลือกเพิ่มเติมอีก 1 รายการนอกเหนือจากการติดตั้งใช้งาน GLSurfaceView คือการตั้งค่า โหมดแสดงผลเพื่อวาดมุมมองต่อเมื่อมีการเปลี่ยนแปลงข้อมูลการวาดของคุณโดยใช้ วันที่ GLSurfaceView.RENDERMODE_WHEN_DIRTY การตั้งค่า:

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);

การตั้งค่านี้จะป้องกันไม่ให้เฟรม GLSurfaceView วาดใหม่จนกว่าคุณจะ โทรหา requestRender() ซึ่งมีมากกว่า ที่มีประสิทธิภาพสำหรับแอปตัวอย่างนี้

สร้างคลาสโหมดแสดงภาพ

การใช้งานคลาส GLSurfaceView.Renderer หรือตัวแสดงผล ภายในแอปพลิเคชันที่ใช้ OpenGL ES เป็นจุดที่สิ่งต่างๆ เริ่มได้รับความสนใจ ชั้นเรียนนี้ การควบคุม สิ่งที่วาดบน GLSurfaceView ที่เกี่ยวข้องกับสิ่งนั้น มี ในโหมดแสดงภาพที่ Android เรียกใช้ได้ 3 วิธีเพื่อหาว่า วิธีวาดบน GLSurfaceView:

  • onSurfaceCreated() - มีการเรียก 1 ครั้งเพื่อตั้งค่าสภาพแวดล้อม OpenGL ES ของมุมมอง
  • onDrawFrame() - เรียกใช้สำหรับแต่ละ วาดภาพใหม่
  • onSurfaceChanged() - โทรหาก เรขาคณิตของมุมมองจะเปลี่ยนไป เช่น เมื่อการวางแนวหน้าจอของอุปกรณ์เปลี่ยนไป

นี่คือการใช้งานตัวแสดงผล OpenGL ES แบบพื้นฐานมาก ซึ่งไม่มีอะไรมากไปกว่าการวาด พื้นหลังสีดำใน GLSurfaceView:

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);
    }
}

เท่านี้ก็เรียบร้อย ตัวอย่างโค้ดข้างต้นสร้างแอปพลิเคชัน Android แบบง่ายที่ แสดงหน้าจอสีดำโดยใช้ OpenGL แม้ว่าโค้ดนี้ ไม่ได้ให้ผลใดๆ ที่น่าสนใจ การสร้างชั้นเรียนเหล่านี้ ถือเป็นรากฐานที่จำเป็นในการเริ่มวาดองค์ประกอบกราฟิก OpenGL

หมายเหตุ: คุณอาจสงสัยว่าทำไมเมธอดเหล่านี้จึงมีพารามิเตอร์ GL10 เมื่อคุณใช้ API ของ OpengGL ES 2.0 ลายเซ็นเมธอดเหล่านี้จะใช้ซ้ำสำหรับ API 2.0 เท่านั้นเพื่อรักษาโค้ดเฟรมเวิร์กของ Android ง่ายขึ้น

หากคุณคุ้นเคยกับ OpenGL ES API แล้ว คุณจะสามารถตั้งค่า OpenGL ES ได้แล้ว สภาพแวดล้อมในแอปและเริ่มวาดกราฟิก แต่หากคุณต้องการความช่วยเหลือเพิ่มเติม ก็เริ่มจาก OpenGL ให้ไปยังบทเรียนถัดไปเพื่อดูคำแนะนำเพิ่มเติม