본문 바로가기

프로그래밍/Android

(93)
[Android] EGL : 4 - 안드로이드 렌더링 EGL Surface , SurfaceTexture 이전 포스트에서 언급한바와같이 안드로이드 카메라의 프레임 데이터를 수신하기 위한 안드로이드 Surface는 opengl es의 pbuffer 텍스처를 통해 생성하게 된다. pbuffer 텍스처 -> SurfaceTexture -> Surface 를 생성해 카메라 api에 전달하게 되면, 카메라는 해당 Surface에 필요한 렌더링을 하게된다. (카메라 api에 따라 SurfaceTexture를 요구할 수도 있음) 이 텍스처는 external 타입의 텍스처이고, 텍스처로의 렌더링(PBO)은 카메라에서 수행하므로 텍스처 생성과 바인딩, 서피스 생성 외에는 특별히 처리할 일은 없다. 렌더링된 이 텍스처를 이제 원하는 화면에 렌더링해야 해야 하는데, 이때 사용..
[Android] EGL : 3 - 쉐이더 grafika 의 Texture2DProgram 을 통해 간단한 쉐이더를 파악해 본다. 쉐이더코드들은 코드 전체가 문자열로 저장한 뒤 컴파일해서 사용하게 된다. Fragment Shader의 경우 TextureTarget 별로 쉐이더 항목이 달라지므로, 필요한 처리를 위한 쉐이더 코드를 작성해 사용한다. VS Code 등에는 쉐이더 관련 익스텐션이 있으므로, 쉐이더 작성후에 안드로이드로 옮기는것도 방법. 참고사항 : 쉐이더의 각 변수는 변수앞에 형식을 정의하는데, 아래와 같다. uniform : 읽기전용으로 어플리케이션에서 전달하는값으로 vertex, fragment shader 공유 attribute : vertex shader 에 데이터를 전달할때 사용 varying : vertex shader 출력..
[Android] EGL : 2 - 텍스처 텍스처 생성 : 버퍼 int createImageTexture( ByteBuffer data, int width, int height, int format ) { // 텍스처 생성 int[] textures = new int[1]; GLES20.glGenTextures( 1, textures, 0); // 여러개의 텍스처를 사용하는 경우 특정 texture unit 활성화 GLES20.glActiveTexture(GLES20.GL_TEXTURE0); // 바인딩 int texId = textures[0]; GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texId); // 필터링 설정 GLES20.glTexParameteri( GLES20.GL_TEXTURE_2D, GLES2..
[Android] EGL : 1 - 기본 구성 Grafika , WebRTC EGL 관련 내용들 검토를 위해 정리한 내용으로, 대부분의 소스는 grafika 에서 참조. 일반적인 비디오 전송시에는 크게 신경쓸 필요가 없으나 비디오 합성이나 3D 환경 구성을 위해서는 해당 내용에 대해 파악이 필요. EGL14 - api 17 EGL15 - api 29 EGL EGL10 의 경우에는 EGLContext.getEGL(); 메쏘드를 통해 egl 객체를 생성한 뒤에 사용했으나 EGL14의 경우에는 대부분 메쏘드가 static 형태로 변경되었음. EGL 을 사용하기 위한 기본 설정들로 한번 작성해 놓으면 변경할게 없는 보일러플레이트 코드들이다. 디스플레이, 컨텍스트, 버퍼 서피스 등을 생성한다. Display EGLDisplay mDisplay = EGL14...
안드로이드 ndk 테스트 코드 ndk 사용해야 하는데, 사용한지 너무 오래되어 다시한번 정리 Project/app/build.gradle android { externalNativeBuild { cmake { path "CMakeLists.txt" cppFlags "-std=c++11" } } } Project/app/CMakeLists.txt cmake_minimum_required(VERSION 3.6) add_library(test-lib SHARED ./src/main/cpp/test.c) include_directories(./src/main/cpp) 클라이언트 // kotlin class Native { init { System.loadLibrary("test-lib") } external fun test(a:Int):vo..
[Android] gson , 복합적인 요소의 파싱 간단히 예를 들어보자. 단일 string, string 배열 두가지 형태가 전달되는 경우 { "item":[ {"name":"kim", "phone":"1234"}, {"name":"park", "phone":["12345","67890"]} ] } POJO 클래스의 구성 자체에 문제가 생긴다. public class Item implements Serializable { private static final long serialVersionUID = -11111L; public String name; // 어느거? public String phone; public List phone; } 이와 같은 경우 별도의 serializer, deserializer 를 구성해 주어야 한다. public class..
[Android] gradle android 빌드 구성 어플리케이션 apply plugin: 'com.android.application' android.applicationVariants.all { variant -> if( variant.name == 'release' ) { parent.classpath += variant.javaCompile.classpaths } } 라이브러리 apply plugin: 'com.android.library' android.libraryVariants.all { variant -> if( variant.name == 'release' ) { parent.classpath += variant.javaCompile.classpaths } } 소스 폴더 // 소스 폴더 구성 // 빌드타입이나 falvor 에 따라 각각의 소..
[Android] ConstraintSet ConstraintSet 은 ConstraintLayout 의 각 뷰들에 대한 Constraint 정보를 담고있는 배열 레이아웃 구성시 각 뷰에 constraint 를 기술하지만 실제 데이터는 부모 ConstraintLayout 의 ConstraintSet 에 저장된다. 동적으로 코드에서 구성시 ConstraintSet 를 생성해 기존 데이터를 clone 하거나 새로 값을 입력 후 ConstraintLayout 에 적용 시켜주면 된다. https://developer.android.com/reference/android/support/constraint/ConstraintSet ConstraintSet | Android Developers ConstraintSet public class Constrain..