[OpenGL ES] 10. Vertex and Fragment Structures

[OpenGL ES] 10. Vertex and Fragment Structures


먼저 OpenGL ES shader 파이프라인을 살펴보고, Attributes, Uniforms, Varying, 내장함수들에 대해서 알아보자.


OpenGL ES, shader_pipeline_example[[OpenGL ES] 10. Vertex and Fragment Structures]


OpenGL ES Attribute(하늘색)는 3차원 객체의 꼭지점으로 사용되기 때문에 vsh는 하나 이상의 attribute를 가져야 한다. 마지막 꼭지점 위치를 정하기 위해선 내장변수 gl_Position을 써야 한다.


3차원 점을 그리려면 gl_PointSize도 설정해라. 나중에 fsh 안에서 내장변수 gl_FragColor를 설정해야 하기 때문이다.


OpenGL ES Attribute, uniform, varying은 GPU 프로세싱 과정과 CPU에서 구동되는 당신의 어플리케이션 사이에 다리를 놓아준다. glDraw* 함수로 그리기 전엔 vsh에 몇 개의 attribute 값을 넣어야 한다. 그 값들은 모든 꼭지점에 같이 적용될 수도 있고, 다르게 적용될 수도 있다.


기본적으로 OpenGL ES programmable pipeline은 최소 8개의 attribute를 지원한다. fsh에는 바로 값을 전달할 수 없고, vsh의 varying 변수에 설정하는 값을 공유하여 받아낼 수 있다. 그림에서 보듯이 varying은 필수사항은 아니지만, Varying 변수를 하나도 안 받는 fsh는 없다.


기본적으로 OpenGL ES programmable pipeline은 적어도 8개의 varying을 지원한다. Uniforms를 통해서도 shader에 값을 넘겨줄 수 있지만, 이름에서 짐작할 수 있듯이 Uniforms는 모든 shader를 처리하기 전엔 값을 바꿀 수 없다.


uniforms의 흔한 사용처는 sampler이다. Sampler 데이터 타입을 기억하는가?


Texture unit을 저장할 때 사용했었다.


Texture unit도 기억하는가?


이 주제에 집중하려면 samplers 데이터 타입은 정수와 비슷하지만 texture 작업에 쓰이는 특별한 종류라고 생각해라.


지원되는 uniform은 shader 타입에 따라 다르다. vsh는 최소 128개의 uniform을 지원하지만, fsh는 겨우 16개만 지원한다. OpenGL ES는 shader마다 우리가 의무적으로 설정해야 하는 몇 개의 내장 변수를 정의해 놓는다.


Vsh는 최종 꼭지점 위치를 정의해야 하고, gl_Position 변수가 그 역할을 담당한다.


OpenGL ES 파이프라인[[OpenGL ES] 10. Vertex and Fragment Structures]


만약, 3차원 공간에 점(3D point)을 그리려면 gl_PointSize도 설정해라. gl_PointSize는 간단하게 3차원 점의 크기를 정한다. 이것은 불(fire)같은 파티클 효과에 매우 유용하다.


vsh는 bool 타입의 gl_FrontFacing 같은 읽기 전용 내장 변수를 가지고 있다. gl_FrontFacing은 현재 가리키는 꼭지점이 앞면인지 아닌지를 알려준다.


fsh에는 출력용 내장변수 gl_FragColor가 있다. OpenGL ES 데스크탑 버전과의 호환을 위해 gl_FragData도 쓸 수 있다. gl_FragData는 그리기 버퍼와 관련이 있는 배열이지만, OpenGL ES는 gl_FragData[0] 하나의 내부 그리기 버퍼만 갖고 있다.


gl_FragColor에만 집중하자.

fsh는 3개의 읽기 전용 내장 변수를 가지고 있다(gl_FrontFacing, gl_FragCoord, gl_PointCoord). Gl_FrontFacing은 vsh에서와 같이 bool 타입이고, 현재 픽셀이 앞면인지 아닌지 알려준다. Gl_FragCoord는 vec4 타입이고 opengl ES 윈도우에서의 픽셀 좌표을 알려준다.


Gl_PointCoord는 3차원 점을 그릴 때 사용된다. gl_PointSize를 기술했으면, 현재 픽셀의 텍스쳐 좌표와 관련된 gl_PointCoord를 사용할 수 있다. 예를 들어, point size를 16으로 설정하면 4*4 픽셀로 표시된다. Gl_PointCoord의 범위는 텍스쳐 좌표처럼 0.0 ~ 1.0이다.


내장출력변수에서 중요한 것은 최종값이다. 당신은 vsh안에서 gl_Position값을 여러 번 바꿀 수 있다(최종 위치가 최종 값이 된다).


OpenGL ES Fragment Structures[[OpenGL ES] 10. Vertex and Fragment Structures]


아래는 내장 변수의 타입이다.


Built-In Variable

 Precision

 Data Type

 Vertex Shader Built-In Variables

 gl_Position

 highp

 vec4

 gl_FrontFacing

 -

 bool

 gl_PointSize

 mediump

 float

 Fragment Shader Built-In Variables

 gl_FragColor

 mediump

 vec4

 gl_FragFacing

 -

 bool

 gl_FragCoord

 mediump

 vec4

 gl_PointCoord

 mediump

 vec2


진짜 shader를 만들 시간이다.


다음의 코드는 vertex shader와 텍스쳐맵을 사용하는 fragment shader를 만든다.


vsh를 만들어보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
precision mediump float;  
precision lowp int;
 
uniform mat4   u_mvpMatrix;
 
attribute vec4 a_vertex;  
attribute vec2 a_texture;
 
varying vec2   v_texture;
 
void main()  
{
    // Pass the texture coordinate attribute to a varying.
    v_texture = a_texture;
 
    // Here we set the final position to this vertex.
    gl_Position = u_mvpMatrix * a_vertex;
}

c


OpenGL ES Vertex[[OpenGL ES] 10. Vertex and Fragment Structures]


이젠 fsh를 만들어보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
precision mediump float;  
precision lowp int;
 
uniform sampler2D    u_maps[2];
 
varying vec2        v_texture;
 
void main()  
{
    // Here we set the diffuse color to the fragment.
    gl_FragColor = texture2D(u_maps[0], v_texture);
 
    // Now we use the second texture to create an ambient color.
    // Ambient color doesn't affect the alpha channel and changes
    // less than half the natural color of the fragment.
    gl_FragColor.rgb += texture2D(u_maps[1], v_texture).rgb * .4;
}
cs


이제 OpenGL ES API로 돌아가서, attributes와 uniforms를 준비한다.


우리는 varyings에 직접 접근할 수 없다는 것을 기억해라. 그래서 vsh가 실행되는 동안 attributes를 설정하고 varying에 전달해야 한다. (fsh에는 바로 값을 전달할 수 없고, vsh의 varying 변수에 설정하는 값을 공유하여 받아낼 수 있다)


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 10. Vertex and Fragment Structures

댓글(0)

Designed by JB FACTORY