Android Programjaim

Android fejlesztés, java, kotlin!!, anno 2010

Opengl-es 2.0 Shaderek, GLSL bemutatás 1. rész

2012. június 06. 10:00 - lacas82

Egy kis áttekintés a shaderekről (árnyalók) eredeti forrás

Az árnyaló gyakorlatilag c/c++ szintű, magasszintű nyelv, a GLSL-el gyakorlatilag kis programocskákat tudunk írni, ami közvetlen a GPU-ba kerül.

Két shader létezik ugyebár, Vertex, és Fragment shader.

Vertex árnyaló: minden egyes vertexen végrehajtódik, tehát amikor kirajzolsz vmit a glDrawArrays-el, akkor a shader minden egyes ponton végrehajtódik. Ha a vertex shadert használod, akkor gyakorlatilag akármit le tudsz programozni.

mik ezek:

      Vertex transzformáció, Normál transzformáció, Normalizálás és scale, Fény,

Textúra koord generálás és transzformáció (tehát ami régen a fixed pipeline-ban voltak)

Fragment árnyaló: A "fregmens" árnyaló az  összes fregmensen végrehajtódik, amit a raszterizáció állít elő. Nah ez egy szép mondat, gyakorlatilag: lehet vele a kép színeit manipulálni, fényeket előállítani, diffúziót, színezést, ködöt, alphablendet, alphatestet, stb.

adattípusok

vec2, vec3, vec4		2D, 3D and 4D float típusú vektor
ivec2, ivec3, ivec4		2D, 3D and 4D integer típusú vektor
bvec2, bvec3, bvec4		2D, 3D and 4D boolean típusú vektor
mat2, mat3, mat4		2x2, 3x3, 4x4 float típusú mátrixok
sampler1D, sampler2D, sampler3D		1D, 2D and 3D textúrák
samplerCube				Cube Map textúra
sampler1Dshadow, sampler2Dshadow	1D and 2D depth-component texture

Attribútumok, uniformisok, és varying-ok

3 típusú input/output van egy shaderben, ezek
uniforms, attributes és varyings

uniforms ezek csak olvashatóak, pl a fény, a fény színe, ezek nem változnak a renderelés alatt, mindkettő shaderbe megtalálhatóak

attributes  csak a vertex shaderben van, és input étékek, amik minden vertexen végrehajtódnak, pl pozició, normál

varyings adatátadásra szolgál a vertex és a fragment shader között, (vertexből a fregmensbe pontosabban, fordítva nem) a fregmens shaderben csak olvasható, de a vertexben írható is

Beépített típusok
GLSL beépített attributúmok a vertex shader-ben:

gl_Vertex			4D vektor a vertex pozició
gl_Normal			3D vektor a vertex normál
gl_Color			4D vektor a vertex szín
gl_MultiTexCoordX		4D vektor a textúra koord a textura unit X-nél
gl_ModelViewMatrix		4x4 Matrix a model-view matrix.
gl_ModelViewProjectionMatrix	4x4 Matrix a model-view-projection matrix.
gl_NormalMatrix			3x3 Matrix az inverz transponse model-view matrix.
				Ez a matrix a normal transzformációkhoz kell.
gl_Position			4D vektor az utolsó feldolgozott vertex pozicióban.

Fregmens shaderben:
 

gl_FragColor			4D vektor az utolsó feldolgozott szín amit a framebufferbe írunk
gl_FragDepth			float a mélységet írhatjuk vele a framebufferbe

Példák:

uniform sampler2D my_color_texture;
uniform mat4 my_texture_matrix;

varying vec3 vertex_to_light_vector;
varying vec3 vertex_to_eye_vector;
 
attribute vec3 tangent;
attribute vec3 binormal;

float my_float = 1;           //nem működik, mivel az 1 az integer, nincs automatikus cast
float my_new_float = 1.0; //működik, mert float, nem kell "f" a float mögé, mint a javaban

tehát magyarázat:

uniformos részek: egy olyan változó amit később tudunk a külső GLES2.0 proginkból állítgatni. sampler2D megmondja, hogy textúráról van szó. mat4, egy matrix4 nyilván, uniform tehát kívűlről állítgathatjuk.

varyingos részek: ezek Vec3-ak, tehát float típsú vektor3-ak, ezek azért varyingok, hogy elérhessük őket később a fragment shaderből is. ekkor ugyanott ugyanígy deklarálnunk kell.

floatok: hiba ha integert adunk meg nekik, nincs automatikus típuskonverzió.

Beépített funkciók:
 

dot		dot product
cross		cross product
texture2D	egy textúra
normalize	normalizál egy vektort
clamp		clamping a vector to a minimum and a maximum

folyt köv.