OpenGL ES 렌 더 링 파이프라인 개요(1)
7489 단어 OpenGLES렌 더 링 파이프라인
OpenGL ES 라인 은 주로 다음 과 같다.
정점 데이터 읽 기->정점 착색 기->조립 도원->래 스 터 화 도원->편 원 착색 기->프레임 버퍼 쓰기->화면 에 표시
4.567917.정점 데 이 터 를 읽 는 것 은 그 려 진 도형 의 정점 데 이 터 를 렌 더 링 라인 에 전달 하 는 것 을 말한다
OpenGL ES 2.0 의 주요 두 부분 은 위의 프로 그래 밍 가능 한 정점 착색 기와 세 션 착색 기 입 니 다.OpenGL ES 를 배 우 는 것 은 주로 렌 더 링 라인 을 이해 하고 CPU 의 렌 더 링 과정 을 이해 하 는 것 입 니 다.주요 프로 그래 밍 작업 은 정점 착색 기와 필름 착색 기의 작성 에 있 습 니 다.
육각형 그리 기
효 과 는 그림 과 같다.
육각형 류
public class SixShape {
private FloatBuffer mVertexBuffer;
private FloatBuffer mColorBuffer;
private int mProgram;
private int mPositionHandle;
private int mColorHandle;
private int muMVPMatrixHandle;
public SixShape(float r) {
initVetexData(r);
}
public void initVetexData(float r) {
//
float[] vertexArray = new float[8*3];
//
float[] colorArray=new float[8*4];
int j = 0, k = 0;
vertexArray[j++] = 0;
vertexArray[j++] = 0;
vertexArray[j++] = 0;
colorArray[k++] = 1;
colorArray[k++] = 1;
colorArray[k++] = 1;
colorArray[k++] = 0;
for (int angle = 0; angle <= 360; angle += 60) {
vertexArray[j++] = (float) (r*Math.cos(Math.toRadians(angle)));
vertexArray[j++] = (float) (r*Math.sin(Math.toRadians(angle)));
vertexArray[j++] = 0;
colorArray[k++] = 1;
colorArray[k++] = 0;
colorArray[k++] = 0;
colorArray[k++] = 0;
}
ByteBuffer buffer = ByteBuffer.allocateDirect(vertexArray.length * 4);
buffer.order(ByteOrder.nativeOrder());
mVertexBuffer = buffer.asFloatBuffer();
mVertexBuffer.put(vertexArray);
mVertexBuffer.position(0);
ByteBuffer cbb=ByteBuffer.allocateDirect(colorArray.length*4);
cbb.order(ByteOrder.nativeOrder());
mColorBuffer=cbb.asFloatBuffer();
mColorBuffer.put(colorArray);
mColorBuffer.position(0);
int vertexShader = loaderShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loaderShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
mProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, fragmentShader);
GLES20.glLinkProgram(mProgram);
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
mColorHandle = GLES20.glGetAttribLocation(mProgram, "aColor");
muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
}
public void draw(float[] mvpMatrix) {
GLES20.glUseProgram(mProgram);
// ,
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, mVertexBuffer);
// ,
GLES20.glVertexAttribPointer(mColorHandle, 4, GLES20.GL_FLOAT, false,4*4, mColorBuffer);
//
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mvpMatrix, 0);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glEnableVertexAttribArray(mColorHandle);
//
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 8);
}
private int loaderShader(int type, String shaderCode) {
int shader = GLES20.glCreateShader(type);
GLES20.glShaderSource(shader, shaderCode);
GLES20.glCompileShader(shader);
return shader;
}
private String vertexShaderCode = "uniform mat4 uMVPMatrix;"
+ "attribute vec3 aPosition;"
+ "attribute vec4 aColor;"
+ "varying vec4 aaColor;"
+ "void main(){"
+ "gl_Position = uMVPMatrix * vec4(aPosition,1);"
+ "aaColor = aColor;"
+ "}";
private String fragmentShaderCode = "precision mediump float;"
+ "varying vec4 aaColor;"
+ "void main(){"
+ "gl_FragColor = aaColor;"
+ "}";
}
육각형 보기
public class SixView extends GLSurfaceView{
public SixView(Context context) {
super(context);
setEGLContextClientVersion(2);
setRenderer(new MyRender());
}
class MyRender implements GLSurfaceView.Renderer {
private SixShape circle;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1);
circle = new SixShape(0.5f);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
}
//
private final float[] mProjectionMatrix = new float[16];
//
private final float[] mViewMatrix = new float[16];
//
private final float[] mMMatrix = new float[16];
private final float[] mViewProjectionMatrix = new float[16];
private final float[] mMVPMatrix = new float[16];
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
GLES20.glViewport(0, 0, width, height);
float ratio= (float) width / height;
//
Matrix.orthoM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 0, 5);
//
Matrix.setLookAtM(mViewMatrix, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0);
}
@Override
public void onDrawFrame(GL10 gl) {
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
Matrix.multiplyMM(mViewProjectionMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);
//
Matrix.setIdentityM(mMMatrix, 0);
Matrix.translateM(mMMatrix,0,0,0,1);
Matrix.rotateM(mMMatrix, 0, 30, 0, 0, 1);
Matrix.multiplyMM(mMVPMatrix, 0, mViewProjectionMatrix, 0, mMMatrix, 0);
circle.draw(mMVPMatrix);
}
}
}
이제 Activity 에서 이 View 를 사용 할 수 있 습 니 다.위의 예 는 간단 하지만 OpenGL ES 프로 그래 밍 을 사용 하 는 주요 절 차 를 포함 합 니 다.정점 데 이 터 를 만 들 고 정점 착색 기 를 작성 하 며 조각 착색 기 를 작성 하여 정점/조각 착색 기 에 데 이 터 를 전달 하 는 것 을 포함 합 니 다.여기 서 가장 중요 한 것 은 착색 기 언어 입 니 다.그 밖 에 투영,평이,회전 등 조작 도 포함한다.그 다음 에 모든 디 테 일과 위의 예 에 언급 되 지 않 은 빛,무늬 등 OpenGL 에 대한 지식 을 자세히 배 울 것 입 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Common Lisp에서 GPU 벡터 기반 글꼴 렌더링그때 조금만 쓴 문자열 드로잉 라이브러리의 소개입니다. 브라우저의 렌더링 엔진을 만드는데 있어서, 취급하기 쉬운 묘화 백엔드가 필요했다. Gecko는 Cairo를 사용하는 것처럼 보였습니다 (과거의 이야기?) 그래서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.