OpenGL ES 착색 기 사용 설명(2)

8503 단어 OpenGLES착색 기
본 고 는 OpenGL ES 착색 기 를 사용 하 는 방법 을 소개 하 였 으 며,어느 정도 참고 가치 가 있 으 며,관심 있 는 어린이 들 은 참고 하 시기 바 랍 니 다.
1.착색 기 언어
착색 기 언어 는 고급 그래 픽 프로 그래 밍 언어 로 C/C+언어 와 유사 하지만 큰 차이 가 존재 합 니 다.예 를 들 어 double,byte 를 지원 하지 않 습 니 다.
,short,unin,enum,unsigned 및 비트 연산 등 은 지원 되 지 않 지만 벡터,행렬 등 원생 데이터 형식 을 많이 넣 었 습 니 다.
데이터 형식 은 스칼라,벡터,행렬,샘플 러,구조 체,배열 등 으로 나 눌 수 있다.

벡터
벡터 전달 매개 변 수 는 하나의 스칼라 만 제공 하면 이 값 은 모든 벡터 의 값 을 설정 하 는 데 사 용 됩 니 다.만약 에 여러 개의 스칼라 나 벡터 를 입력 하면 왼쪽 에서 오른쪽으로 벡터 변 수 를 설정 합 니 다.만약 에 여러 개의 벡터 를 매개 변수 로 한다 면 적어도 변수 와 같은 분량 이 있어 야 합 니 다.

vec4 myVec4 = vec4(1.0); // myVec4 = {1.0, 1.0, 1.0, 1.0}
vec3 myVec3 = vec3(1.0, 0.0, 0.5); // myVec3 = {1.0, 0.0, 0.5}
vec3 temp = vec3(myVec3); // temp = myVec3
vec2 myVec2 = vec2(myVec3); // myVec2 = {myVec3.x, myVec3.y}
myVec4 = vec4(myVec2, temp); // myVec4 = {myVec2.x, myVec2.y, temp.x, temp.y}
행렬
매트릭스 작업 은 OpenGL ES 에서 매우 광범 위 하 게 사용 되 고 도형 의 이동 확대 회전 과 관련 된 작업 은 모두 행렬 에 의 해 이 루어 진다.
행렬 에 매개 변수 전달:
  • 은 하나의 스칼라 를 제공 합 니 다.그러면 스칼라 는 행렬 의 주 대각선
  • 에 복 제 됩 니 다.
  • 하나의 행렬 은 여러 개의 벡터 에 의 해 할당 된다.예 를 들 어 mat 2 는 두 개의 vec 2 로 할당 할 수 있다
  • .
  • 하나의 행렬 은 여러 개의 스칼라 에 의 해 할당 되 고 열 에 따라 할당 된다.
  • 벡터 와 행렬 의 분량
    벡터 는 일반적으로 위치,색상 무늬 좌표 등 한 개 이상 의 양 을 저장 하 는 데 사용 되 며,벡터 의 한 분량 을 방문 하 는 방법 은<벡터 명,분량 명>이다.
  • 벡터 를 색채 로 취급 하고 네 가지 분량 은 r,g,b,a 로 각각 빨간색,녹색,파란색,투명 도 를 대표 한다
  • .
  • 벡터 를 위치 로 보고 네 가지 분량 은 x,y,z,w 로 각각 x 축,y 축,z 축,w
  • 를 대표 한다.
  • 벡터 를 무늬 좌표 로 취급 하고 네 개의 분량 은 s,t,p,q 로 각각 무늬 좌표 의 서로 다른 분량 을 대표 한다.
  • 이 세 가지 서로 다른 명명 방안 은 혼합 해서 사용 할 수 없 으 며,이외에 벡터 를 배열 로 보고 다음 표 로 접근 할 수 있다.
    
    vec3 myVec3 = vec3(0.0, 1.0, 2.0); // myVec3 = {0.0, 1.0, 2.0}
    float x = myVec3.x;
    vec3 temp;
    temp = myVec3.xyz; // temp = {0.0, 1.0, 2.0}
    temp = myVec3.xxx; // temp = {0.0, 0.0, 0.0}
    temp = myVec3.zyx; // temp = {2.0, 1.0, 0.0}
    vec4 temp2 = myVec3.xxyz; // temp2 = {0.0, 0.0, 1.0, 2.0}
    행렬 에 대한 방문 은 2 차원 배열 로 하면 되 고 행렬 은 여러 개의 벡터 로 구성 된다 고 볼 수 있다.
    
    mat4 myMat4 = mat4(1.0); // Initialize diagonal to 1.0 (identity)
    vec4 col0 = myMat4[0]; // Get col0 vector out of the matrix
    float m1_1 = myMat4[1][1]; // Get element at [1][1] in matrix
    float m2_2 = myMat4[2].z; // Get element at [2][2] in matrix
    샘플 러
    샘플 러 는 전문 적 으로 무늬 샘플링 과 관련 된 조작 을 하 는데 일반적인 상황 에서 다음 샘플 러 변 수 는 옷 무늬 스티커 를 대표 한다.
    sampler2D/sampler3D/samplerCube
    샘플 러 변 수 는 착색 기 에서 초기 화 된 것 이 아니 라 주 프로그램 에서 전 달 됩 니 다.
    배열
    배열 을 설명 할 때 배열 크기 를 지정 합 니 다.반대로 배열 에 접근 할 때 아래 표 는 컴 파일 시 상수 여야 합 니 다.그러면 컴 파일 러 는 적당 한 크기 의 배열 을 자동 으로 만 듭 니 다.
    형식 변환
    착색 기 언어 는 자동 으로 향상 되 는 기능 이 없고 강제 적 으로 전환 할 수 없 으 며 구조 기 로 유형 전환 을 완성 할 수 있 습 니 다.모든 내장 변수 유형 은 관련 된 구조 기 가 있 습 니 다.
    
    float f = 1; // error
    int i = 0.0; // error
    float f = 1.0 // ok
    bool b = bool(f) // ok, 0  true
    float f = float(b) // ok,bool     ,true  1.0,false  0.0
    int i = 0; //ok
    bool b = bool(i) // ok,int  bool
    변수 한정 부호
    const:상수,컴 파일 시 상수,그 값 은 변 하지 않 아 운행 효율 을 높 일 수 있 습 니 다.
    attribute:속성 변 수 는 정점 착색 기 에 만 사 용 됩 니 다.이 한정 문자 로 장 식 된 변 수 는 숙주 프로그램 에서 렌 더 링 라인 으로 들 어 오 는 변 수 를 받 아들 입 니 다.일반적으로 정점 마다 다른 양,예 를 들 어 정점 위치,색깔,법 선 등에 사용 된다.
    uniform:통 일 된 변 수 는 일반적으로 같은 그룹의 정점 으로 구 성 된 물체 의 모든 정점 이 같은 양 이다.예 를 들 어 광원 위치,행렬 전환,색깔,빛 등 이다.
    varying:변 수 는 정점 착색 기의 출력 과 필름 착색 기의 입력 을 저장 하 는 데 사 용 됩 니 다.각 정점 착색 기 는 출력 데 이 터 를 하나 이상 의 필름 착색 기의 입력 으로 바 꾸 고 래 스 터 화 단계 에서 일련의 변 수 를 생 성 합 니 다.
    varying 변수의 원리
    선분 에 혼합 삽입 값 을 진행 하 다

    삼각형 에 혼합 삽입 값 을 하 다

    착색 기 변수 가 져 오기
    attribute 형식 변 수 를 가 져 옵 니 다.attribute 한정 문자 수식 변수 에 대한 값 은 숙주 프로그램 에서 렌 더 링 라인 으로 전 송 됩 니 다.glGetAttribLocation 함 수 를 사용 하여 착색 기 에서 속성 변수의 인용 을 얻 습 니 다.
    
    public static native int glGetAttribLocation(
      int program, //        
      String name //        
    );
    그리고 glVertex AttribpPointer 함 수 를 사용 하여 glGetAttribLocation 에서 돌아 오 는 착색 기 변 수 를 대표 하 는 변 수 를 참조 합 니 다.
    
    public static void glVertexAttribPointer(
      int indx, //        
      int size, //         ,  x、y、z  3
      int type, //     , GLES20.GL_FLOAT
      boolean normalized, //      ,            
      int stride, //   ,              ,              
      java.nio.Buffer ptr //         
     )
    uniform 형식의 변 수 를 가 져 옵 니 다.glGetUniformLocation 함 수 를 사용 하여 착색 기 에서 통 일 된 변수의 인용 을 얻 습 니 다.
    
    public static native int glGetUniformLocation(
      int program,
      String name
     );
    그리고 glUniformXXX 함 수 를 사용 하여 착색 기 에 데 이 터 를 전달 합 니 다.예 를 들 어 glUniformMatrix4fv 함수 입 니 다.
    
    public static native void glUniformMatrix4fv(
      int location, //        
      int count, //           。        ,       1
      boolean transpose, //        ,     uniform    。   false
      float[] value, //             
      int offset //   , 0
     );
    glUniformNf/glUniformNfv:N 개의 부동 소수점 을 파이프라인 에 전달 합 니 다.
    glUniformNi/glUniformNiv:N 개의 정 수 를 파이프라인 에 전달 합 니 다.
    glUniformMatrixNfv:N 개의 정 수 를 파이프라인 에 전달 하고 N*N 행렬 을 파이프라인 에 전달 합 니 다.
    내장 변수
    내장 변 수 는 성명 없 이 사용 할 수 있 으 며,내장 변 수 는 두 가지 로 나 뉘 어 입력 과 출력 변수 로 나 뉜 다.
    입력 변 수 는 렌 더 링 라인 의 고정 기능 부분 에서 생 성 된 정 보 를 착색 기 에 전달 하여 프로그래머 가 사용 할 수 있 도록 하고 출력 변 수 는 착색 기 가 생 성 한 정 보 를 렌 더 링 라인 에 전달 하 는 고정 기능 을 책임 집 니 다.
    정점 착색 기
    정점 착색 기의 내장 변 수 는 주로 출력 변수 로 착색 기 에서 발생 하 는 값 을 렌 더 링 라인 에 전달 하기 때문에 정점 착색 기 에서 이러한 내장 변 수 를 할당 해 야 합 니 다.gl 를 포함 합 니 다.Position、gl_PointSize 등.
  • gl_Position:정점 착색 기 에서 가 져 온 정점 원시 데 이 터 를 이동 하고 축소 하 며 회전 하 는 등 변환 한 후 새로운 위 치 를 생 성 합 니 다.새로운 정점 위 치 는 이 변 수 를 통 해 렌 더 링 라인 에 전달 되 는 후속 작업 입 니 다.
  • gl_PointSize:정점 착색 기 에서 점 의 크기 를 계산 할 수 있 습 니 다.단 위 는 픽 셀 이 고 기본 값 은 1 입 니 다.일반적으로 점 그리 기 방식 에 의미 가 있 습 니 다.
  • 필름 착색 기
    필름 착색 기 내 장 된 입력 변수,glFragCoord、gl_FrontFacing,그리고 읽 기만 하 는 것 은 렌 더 링 라인 메타 착색 기 이전 단계 에서 생 성 된 것 입 니 다.
  • gl_FragCoord:vec 4 형식 데이터 로 현재 메타 의 상대 적 인 창 위치 에 있 는 좌 표를 포함 합 니 다.
  • gl_FrontFacing:bool 형식의 내장 입력 변 수 는 현재 처리 되 고 있 는 메타 데이터 가 래 스 터 화 단계 에서 메타 데이터 의 정면 을 생 성 하 는 지 여 부 를 나타 낸다.점,선분 에는 정반 면 의 분 리 된 도원 이 없다.생 성 된 외 진 곳 은 기본적으로 정면 이 고 삼각형 그림 의 정면 은 프로그램 에서 와 인 딩 설정 과 그림 의 정점 에 있 는 구체 적 인 와 인 딩 상황 에 달 려 있다.
  • 필름 착색 기 내 장 된 출력 변수 glFragColor、gl_FragData,필름 착색 기 에서 이 두 개의 내장 변수 에 값 을 기록 합 니 다.
  • gl_FragColo:vec 4 변 수 는 필름 착색 기 에서 계산 한 필름 색상 값 을 전달 하 는 데 사 용 됩 니 다.
  • 함수.
    다른 언어 와 마찬가지 로 매개 변 수 는 용 도 를 지정 할 수 있 고 구체 적 으로 in,out,inout 수식 자 는 이 매개 변수 가 입 참 인지 출 참 인지 나타 낸다.
    편 원 착색 기 부동 소수점 변수 정밀도
    필름 착색 기의 부동 소수점 형식 데 이 터 는 정밀 도 를 정 해 야 하 며,정밀 도 를 지정 하지 않 으 면 컴 파일 오류 가 발생 할 수 있 습 니 다.세 가지 정밀도 유형 이 있 습 니 다.lowp,mediump,highp 는 보통 mediump 유형 을 사용 하면 됩 니 다.개발 중 같은 필름 착색 기 에서 부동 소수점 유형 이 차 가워 지 는 것 이 같은 정밀도 유형 이 라면 전체 착색 기 에서 부동 소수점 유형 기본 정 도 를 지정 할 수 있 습 니 다.
    정밀도<정밀도><유형>
    precision mediump float;
    2.착색 기 프로그램
    두 개의 대상 을 만들어 야 착색 기 를 사용 하여 렌 더 링 할 수 있 습 니 다:착색 기 대상 과 프로그램 대상.
    착색 기 소스 코드 는 대상 형식(obj 파일 과 유사)으로 컴 파일 되 었 습 니 다.컴 파일 된 후 착색 기 대상 은 프로그램 대상 에 연결 할 수 있 고 프로그램 대상 은 여러 착색 기 대상 을 연결 할 수 있 습 니 다.
    연 결 된 착색 기 대상 을 가 져 오 는 과정:
  • 정점 착색 기와 조각 착색 기 를 만 듭 니 다.
  • 모든 착색 기 대상 에 소스 코드 연결
  • 착색 기 대상 컴 파일
  • 프로그램 대상 만 들 기
  • 컴 파일 된 착색 기 대상 을 프로그램 대상 에 연결 합 니 다
  • 연결 프로그램 대상
  • 오류 가 없 으 면 뒤에서 이 프로그램 을 사용 할 수 있 습 니 다.예 를 들 어 프로그램 에서 착색 기 변 수 를 가 져 오고 그 다음 에 전달 값 등 을 사용 할 수 있 습 니 다.
    착색 기 대상 만 들 기
    
    public static native int glCreateShader(
     int type //      ,GLES20.GL_VERTEX_SHADER GLES20.GL_FRAGMENT_SHADER
    );
    착색 기 대상 에 소스 코드 연결
    
    public static native void glShaderSource(
      int shader,
      String string //      
     );
    착색 기 개체 컴 파일
    
    public static native void glCompileShader(
      int shader
     );
    프로그램 개체 만 들 기
    
    mProgram = GLES20.glCreateProgram();
    컴 파일 된 착색 기 대상 을 프로그램 대상 에 연결 합 니 다.
    
    public static native void glAttachShader(
      int program,
      int shader
     );
    연결 프로그램 개체
    
    public static native void glLinkProgram(
      int program
     );
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기