OpenGL ES 착색 기 사용 설명(2)
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 에서 매우 광범 위 하 게 사용 되 고 도형 의 이동 확대 회전 과 관련 된 작업 은 모두 행렬 에 의 해 이 루어 진다.
행렬 에 매개 변수 전달:
벡터 는 일반적으로 위치,색상 무늬 좌표 등 한 개 이상 의 양 을 저장 하 는 데 사용 되 며,벡터 의 한 분량 을 방문 하 는 방법 은<벡터 명,분량 명>이다.
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 등.
필름 착색 기 내 장 된 입력 변수,glFragCoord、gl_FrontFacing,그리고 읽 기만 하 는 것 은 렌 더 링 라인 메타 착색 기 이전 단계 에서 생 성 된 것 입 니 다.
다른 언어 와 마찬가지 로 매개 변 수 는 용 도 를 지정 할 수 있 고 구체 적 으로 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
);
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Common Lisp에서 GPU 벡터 기반 글꼴 렌더링그때 조금만 쓴 문자열 드로잉 라이브러리의 소개입니다. 브라우저의 렌더링 엔진을 만드는데 있어서, 취급하기 쉬운 묘화 백엔드가 필요했다. Gecko는 Cairo를 사용하는 것처럼 보였습니다 (과거의 이야기?) 그래서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.