Android 애플리케이션에서 OpenGL ES로 그래픽을 그리려면
컨테이너 이미지를 사용할 수 있습니다 이를 위한 더 간단한 방법 중 하나는
GLSurfaceView
및 GLSurfaceView.Renderer
가
GLSurfaceView
는 OpenGL로 그린 그래픽의 뷰 컨테이너입니다.
GLSurfaceView.Renderer
는 이 뷰 내에 그려지는 내용을 제어합니다. 자세한 내용은
자세한 내용은 OpenGL ES
참조하세요.
GLSurfaceView
는 OpenGL ES 그래픽을
애플리케이션입니다. 이 방법은 전체 화면 또는 전체 화면에 가까운 그래픽 뷰에서 선택하면 적합합니다.
레이아웃의 작은 부분에 OpenGL ES 그래픽을 통합하려는 개발자는
TextureView
를 살펴보세요. DIY 개발자는
SurfaceView
를 사용하여 OpenGL ES 뷰를 빌드할 수는 있지만
상당히 많은 추가 코드를 작성해야 합니다.
이 과정에서는 간단한 GLSurfaceView
및 GLSurfaceView.Renderer
의 최소 구현을 완료하는 방법을 설명합니다.
애플리케이션 활동입니다.
매니페스트에서 OpenGL ES 사용 선언
애플리케이션에서 OpenGL ES 2.0 API를 사용하려면 다음을 추가해야 합니다. 선언을 추가해야 합니다.
<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 그래픽의 활동 만들기
OpenGL ES를 사용하는 Android 애플리케이션에는
사용자 인터페이스입니다. 다른 애플리케이션과의 주요 차이점은 애플리케이션의 레이아웃에
있습니다. 많은 애플리케이션에서는 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) } }
자바
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) 이상이 필요합니다. 따라서 Android 프로젝트에서 해당 API 이상을 대상으로 해야 합니다.
GLSurfaceView 객체 빌드
GLSurfaceView
는 OpenGL ES를 그릴 수 있는 특수 뷰입니다.
있습니다.
자체적인 기능은 많지 않습니다. 객체의 실제 그리기는
이 뷰에서 설정한 GLSurfaceView.Renderer
입니다. 실제로 이 코드에서는
객체가 너무 얇기 때문에 확장을 건너뛰고 수정되지 않은
GLSurfaceView
인스턴스에 대한 IP 주소를 가져올 수 있지만 그렇게 해서는 안 됩니다. 이 클래스를
자세한 내용은 터치에 응답하기
이벤트 강의를 듣습니다.
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) } }
자바
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
구현에 추가적으로 선택사항인 또 다른 옵션은 다음과 같습니다.
를 사용하여 그리기 데이터가 변경될 때만 뷰를 그립니다.
GLSurfaceView.RENDERMODE_WHEN_DIRTY
설정:
Kotlin
// Render the view only when there is a change in the drawing data renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
자바
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
이 설정은 사용자가 작업을 다시 시작할 때까지 GLSurfaceView
프레임을 다시 그리지 않습니다.
requestRender()
을(를) 통해
효율적으로 사용할 수 있습니다
렌더기 클래스 빌드
GLSurfaceView.Renderer
클래스 또는 렌더기의 구현
을 사용하는 것이 흥미롭게 시작됩니다. 이 수업
컨트롤
연결된 GLSurfaceView
에 그려지는 내용 현재
어떤 것이 무엇인지 파악하기 위해 Android 시스템에서 호출하는 세 가지 메서드가 있습니다.
GLSurfaceView
에 그리는 방법:
onSurfaceCreated()
~ 뷰의 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) } }
자바
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); } }
실행할 작업은 이것뿐입니다. 위의 코드 예제는 는 OpenGL을 사용하여 검은색 화면을 표시합니다. 이 코드는 그다지 흥미로운 작업을 하지 않지만 그래픽 요소를 그리기 시작하는 데 필요한 기초와 OpenGL입니다.
참고: OpenGL ES 2.0 API를 사용할 때 이러한 메서드에 GL10
매개변수가 있는 이유가 궁금할 수 있습니다.
이러한 메서드 서명은 Android 프레임워크 코드 유지를 위해 2.0 API에서 단순히 재사용됩니다.
간소화합니다.
OpenGL ES API에 익숙하다면, 이제 OpenGL ES API를 사용해 그래픽을 그리기 시작할 수 있습니다. 하지만 Cloud SQL을 사용하는 데 도움이 더 필요한 경우 다음 강의로 넘어가서 몇 가지 힌트를 더 살펴보세요.