[정수리] 안드로이드 OpenGL ES2.0 프로그래밍(3)
25216 단어 opengles
네가 그릴 모양을 정의한 후에 그것을 그려야 한다.OpenGLES 2.0을 사용하면 API가 렌더링 파이프라인에 대한 제어 능력을 많이 제공하기 때문에 모양이 조금 복잡할 수 있습니다.
본고는 네가 앞에서 정의한 그 형상들을 어떻게 그리는지 설명한다.
형태 초기화
그림을 그리기 전에 모양을 초기화하고 불러와야 합니다.모양의 구조 (원시적인 좌표들을 가리키는 것) 가 실행 과정에서 바뀌지 않는 한, 당신은 당신의 Renderer 방법
onSurfaceCreated()
에서 메모리와 효율에 대한 초기화 작업을 해야 합니다.public void onSurfaceCreated(GL10 unused, EGLConfig config) {
...
//
mTriangle = new Triangle();
//
mSquare = new Square();
}
모양 그리기
OpenGLES 2.0을 사용하여 정의된 모양을 그리려면 대량의 코드가 필요합니다. 왜냐하면 도형 렌더링 파이프에 많은 정보를 제공해야 하기 때문입니다.전형적인 것은 다음과 같은 몇 가지를 정의해야 한다.
모양을 칠하기 위해vertexshader가 최소한 하나 필요합니다.이 모양들은 컴파일되어 OpenGLES 프로그램에 추가되어야 합니다. 프로그램 다음에 모양을 그리는 데 사용됩니다.다음은 모양을 그릴 수 있는 기본 shader를 정의하는 방법을 보여 주는 예입니다.
private final String vertexShaderCode =
"attribute vec4 vPosition;" +
"void main() {" +
" gl_Position = vPosition;" +
"}";
private final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";
Shader는 OpenGLShading Language(GLSL) 코드를 포함하고 있으며 사용하기 전에 컴파일해야 합니다.이러한 코드를 컴파일하려면 Renderer 클래스에 도구 클래스 메서드를 만듭니다.
public static int loadShader(int type, String shaderCode){
// vertex shader (GLES20.GL_VERTEX_SHADER)
// fragment shader (GLES20.GL_FRAGMENT_SHADER)
int shader = GLES20.glCreateShader(type);
// shader
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
모양을 그리려면 shader 코드를 컴파일해서 OpenGLES 프로그램 대상에 추가한 다음 이 프로그램을 연결해야 합니다.renderer 대상의 구조기에서 이런 일을 하면 한 번만 하면 된다.
주: OpenGLES shader와 링크linking 프로그램들을 컴파일하는 것은 CPU를 많이 소모하기 때문에 여러 번 이런 일을 하는 것을 피해야 합니다.만약 실행할 때 shader의 내용을 모른다면, 코드를 한 번만 만들고 그것을 캐시해서 여러 번 만들지 않도록 해야 합니다.
public Triangle() {
...
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram = GLES20.glCreateProgram(); // OpenGL ES Program
GLES20.glAttachShader(mProgram, vertexShader); // vertex shader program
GLES20.glAttachShader(mProgram, fragmentShader); // fragment shader program
GLES20.glLinkProgram(mProgram); // OpenGL ES program
}
이 때, 당신은 진정한 그림 호출을 추가할 준비가 되어 있습니다.렌더링 파이프라인에 원하는 그림과 그리는 방법을 알려주기 위해 많은 파라미터를 지정해야 한다.그림 그리기 동작은 모양에 따라 다르기 때문에, 당신의 형상 클래스가 자신의 그림 그리기 논리를 포함하도록 하는 것은 좋은 생각입니다.
모양을 그리는
draw()
방법을 만듭니다.다음 코드는 모양의vertexshader와fragmentshader에 위치와 색상 값을 설정하고 그리기 기능을 실행합니다.public void draw() {
// program OpenGL ES
GLES20.glUseProgram(mProgram);
// vertex shader vPosition handle
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
// handle
GLES20.glEnableVertexAttribArray(mPositionHandle);
//
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
// fragment shader vColor handle
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
//
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
//
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
//
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
이 코드가 완성되면, 이 대상을 그리는 데는 렌더의
onDrawFrame()
호출 draw()
방법만 필요합니다.응용 프로그램을 실행할 때 다음과 같이 보여야 합니다.그림 1.투사와 뷰포트가 없을 때 삼각형을 그립니다
이 예의 코드에는 아직도 많은 문제가 있다.우선, 그것은 사람에게 인상을 남기지 않는다.그 다음에 삼각형은 세로에서 가로로 바뀔 때 납작해진다.삼각형이 변형된 이유는 정점들이 화면의 넓이와 높이를 수정하지 않았기 때문이다.너는 투사와 뷰포트를 사용하여 이 문제를 수정할 수 있다.그럼 다음에 얘기할게요.
전강
다음 강의
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Rust에서 OpenGL과 같은 그래픽 라이브러리를 활용하는 방법Rust에서 OpenGL, OpenGLES, EGL 등 도형 라이브러리(본가가 원래 C 언어의 라이브러리)를 사용하는 방법을 총결하였다. 알다시피 Rust에서 다른 언어의 라이브러리를 사용할 때는 Foreign Fu...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.