Android
OpenGL ES 2.0 이상 시작하기
수색…
소개
이 주제는 Android에서 OpenGL ES 2.0 이상 을 설정하고 사용 하는 방법 입니다. OpenGL ES는 콘솔, 스마트 폰, 가전 제품 및 차량을 포함한 임베디드 시스템에서 2D 및 3D 가속 그래픽의 표준입니다.
GLSurfaceView 및 OpenGL ES 2.0 이상 설정
애플리케이션에서 OpenGL ES를 사용하려면 다음을 매니페스트에 추가해야합니다.
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
확장 된 GLSurfaceView를 생성하십시오 :
import static android.opengl.GLES20.*; // To use all OpenGL ES 2.0 methods and constants statically
public class MyGLSurfaceView extends GLSurfaceView {
public MyGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
setEGLContextClientVersion(2); // OpenGL ES version 2.0
setRenderer(new MyRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
public final class MyRenderer implements GLSurfaceView.Renderer{
public final void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Your OpenGL ES init methods
glClearColor(1f, 0f, 0f, 1f);
}
public final void onSurfaceChanged(GL10 unused, int width, int height) {
glViewport(0, 0, width, height);
}
public final void onDrawFrame(GL10 unused) {
// Your OpenGL ES draw methods
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
}
}
MyGLSurfaceView
를 레이아웃에 추가하십시오.
<com.example.app.MyGLSurfaceView
android:id="@+id/gles_renderer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
최신 버전의 OpenGL ES 를 사용하려면 매니페스트의 버전 번호를 정적 가져 오기에서 변경하고 setEGLContextClientVersion
변경 setEGLContextClientVersion
.
애셋 파일에서 GLSL-ES 셰이더 컴파일 및 연결
자산 폴더는 GLSL-ES 쉐이더 파일을 저장하는 가장 일반적인 장소입니다. OpenGL ES 응용 프로그램에서이를 사용하려면 먼저 문자열에로드해야합니다. 이 함수는 에셋 파일에서 문자열을 만듭니다.
private String loadStringFromAssetFile(Context myContext, String filePath){
StringBuilder shaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(myContext.getAssets().open(filePath)));
String line;
while((line = reader.readLine()) != null){
shaderSource.append(line).append("\n");
}
reader.close();
return shaderSource.toString();
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG, "Could not load shader file");
return null;
}
}
이제 스팅에 저장된 셰이더를 컴파일하는 함수를 만들어야합니다.
private int compileShader(int shader_type, String shaderString){
// This compiles the shader from the string
int shader = glCreateShader(shader_type);
glShaderSource(shader, shaderString);
glCompileShader(shader);
// This checks for for compilation errors
int[] compiled = new int[1];
glGetShaderiv(shader, GL_COMPILE_STATUS, compiled, 0);
if (compiled[0] == 0) {
String log = glGetShaderInfoLog(shader);
Log.e(TAG, "Shader compilation error: ");
Log.e(TAG, log);
}
return shader;
}
이제 쉐이더를로드, 컴파일 및 링크 할 수 있습니다.
// Load shaders from file
String vertexShaderString = loadStringFromAssetFile(context, "your_vertex_shader.glsl");
String fragmentShaderString = loadStringFromAssetFile(context, "your_fragment_shader.glsl");
// Compile shaders
int vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderString);
int fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderString);
// Link shaders and create shader program
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram , vertexShader);
glAttachShader(shaderProgram , fragmentShader);
glLinkProgram(shaderProgram);
// Check for linking errors:
int linkStatus[] = new int[1];
glGetProgramiv(shaderProgram, GL_LINK_STATUS, linkStatus, 0);
if (linkStatus[0] != GL_TRUE) {
String log = glGetProgramInfoLog(shaderProgram);
Log.e(TAG,"Could not link shader program: ");
Log.e(TAG, log);
}
오류가 없으면 쉐이더 프로그램을 사용할 수 있습니다.
glUseProgram(shaderProgram);
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow