ในการวาดกราฟิกด้วย OpenGL ES ในแอปพลิเคชัน Android คุณต้องสร้าง
ดูคอนเทนเนอร์สำหรับคนกลุ่มนี้ วิธีที่ชัดเจนที่สุดวิธีหนึ่งคือการใช้ทั้ง
GLSurfaceView
และ GLSurfaceView.Renderer
ต
GLSurfaceView
เป็นคอนเทนเนอร์มุมมองสำหรับกราฟิกที่วาดด้วย 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 ให้ไปยังบทเรียนถัดไปเพื่อดูคำแนะนำเพิ่มเติม