OpenGL ES 3 рдкрд░ рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдкрд░ рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА рдбреЗрдореЛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА (рд╡рд░реНрдЪреБрдЕрд▓ рд╢реИрдбреЛ рдбреЗрдкреНрде рдХреНрдпреВрдмрдореИрдк рдЯреЗрдХреНрд╕рдЪрд░) рдПрдХ рдХреНрдпреВрдмреИрдк рдмрдирд╛рд╡рдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ рдЬрдм 6 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреЗрд╣рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдирд┐рдпрдорд┐рдд 2 рдбреА рдПрдЯрд▓рд╕ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреНрдпреВрдмрд┐рдХ рдореИрдк рдХреЗ рдореВрд▓ рдЪреЗрд╣рд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреИрдХ рдЯрд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдХрд╛рд╢ рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рд╕реНрд░реЛрдд рд╕реЗ рдЫрд╛рдпрд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рдЫрд╡рд┐



рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореИрдВ рдореВрд▓ рдУрдордиреА-рджрд┐рд╢рд╛рддреНрдордХ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓рд┐рдВрдХ рдореЗрдВ рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо 6 рд░реИрдЦрд┐рдХ рдЕрдиреБрдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рддреБрд░рдВрдд рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗред

рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред 6 рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рд░реЛрд╢рдиреА рдХреЗ рдПрдХ рдмрд┐рдВрджреБ рд╕реНрд░реЛрдд рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╛рдиреА рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ each X, ┬▒ Y, the Zред рддрд╛рдХрд┐ рдХрд╛рд░реНрдб рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░рд╛рд▓ рди рд╣реЛ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдорд╛рди рдХреЗ рд▓рд┐рдП FOV рдХреЛ 90 рдбрд┐рдЧреНрд░реА рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ:

рдЫрд╡рд┐

6 рдореЙрдбрд▓-рд╡реНрдпреВ рдореИрдЯреНрд░рд┐рд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рдкреА - рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ):

Math::ViewMatrix( vec3( 0.0f, 0.0f, 1.0f ), vec3( 0.0f, 1.0f, 0.0f ), vec3( -1.0f, 0.0f, 0.0f ), P ); Math::ViewMatrix( vec3( 0.0f, 0.0f, -1.0f ), vec3( 0.0f, 1.0f, 0.0f ), vec3( 1.0f, 0.0f, 0.0f ), P ); Math::ViewMatrix( vec3( 1.0f, 0.0f, 0.0f ), vec3( 0.0f, 0.0f, 1.0f ), vec3( 0.0f, -1.0f, 0.0f ), P ); Math::ViewMatrix( vec3( 1.0f, 0.0f, 0.0f ), vec3( 0.0f, 0.0f, -1.0f ), vec3( 0.0f, 1.0f, 0.0f ), P ); Math::ViewMatrix( vec3( -1.0f, 0.0f, 0.0f ), vec3( 0.0f, 1.0f, 0.0f ), vec3( 0.0f, 0.0f, -1.0f ), P ); Math::ViewMatrix( vec3( 1.0f, 0.0f, 0.0f ), vec3( 0.0f, 1.0f, 0.0f ), vec3( 0.0f, 0.0f, 1.0f ), P ); LMatrix4 ViewMatrix( const LVector3& X, const LVector3& Y, const LVector3& Z, const LVector3& Position ) { LMatrix4 Matrix; Matrix[0][0] = Xx; Matrix[1][0] = Xy; Matrix[2][0] = Xz; Matrix[3][0] = -X.Dot( Position ); Matrix[0][1] = Yx; Matrix[1][1] = Yy; Matrix[2][1] = Yz; Matrix[3][1] = -Y.Dot( Position ); Matrix[0][2] = Zx; Matrix[1][2] = Zy; Matrix[2][2] = Zz; Matrix[3][2] = -Z.Dot( Position ); Matrix[0][3] = 0.0f; Matrix[1][3] = 0.0f; Matrix[2][3] = 0.0f; Matrix[3][3] = 1.0f; return Matrix; } 


рд╕рднреА рдЕрдиреБрдорд╛рди рд╕рдорд╛рди рд╣реИрдВ, 1: 1 рдХреЗ рдкрд╣рд▓реВ рдФрд░ 90 рдбрд┐рдЧреНрд░реА рдХреЗ рдХреЛрдг рдХреЗ рд╕рд╛рде рд╡рд╛рджрд╛ рдХрд░рддреЗ рд╣реИрдВ:

 float NearCP = 0.5f; float FarCP = 512.0f; Math::Perspective( 90.0f, 1.0f, NearCP, FarCP ); 


6 рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкреНрд░рдХрд╛рд╢ рд╕реНрд░реЛрдд рд╕реЗ рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рдХреА рджреВрд░реА рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 8-рдмрд┐рдЯ RGBA рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреИрдХ рдХрд░рддреЗ рд╣реИрдВред

 void main() { float D = distance( v_WorldPosition, u_LightPosition.xyz ); out_FragColor = Pack( D / 512.0 ); } vec4 Pack(float Value) { const vec4 BitSh = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0); const vec4 BitMsk = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 ); vec4 Comp = fract( Value * BitSh ); Comp -= Comp.xxyz * BitMsk; return Comp; } 


рдЬрдм рдПрдЯрд▓рд╕ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЙрдЪрд┐рдд рд╡реНрдпреВрдкреЛрд░реНрдЯ рдФрд░ рдХреИрдВрдЪреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрди рд╕рдорд╛рди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрдХ рдордирдорд╛рдиреА рдПрдЯрд▓рд╕ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ 6 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ), рд╣рдо рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

  LRectDivider( int Size, int NumSubRects ) : FSize( Size ) , FNumSubRects( NumSubRects ) , FCurrentX( 0 ) , FCurrentY( 0 ) { float Sqrt = sqrt( float( FNumSubRects ) ); FNumSlotsWidth = ( int )ceil( Sqrt ); FNumSlotsHeight = ( int )Sqrt; FSlotWidth = FSize / FNumSlotsWidth; FSlotHeight = FSize / FNumSlotsHeight; } void GetNextRect( int* X, int* Y, int* W, int* H ) { if ( X ) { *X = FCurrentX * FSlotWidth; } if ( Y ) { *Y = FCurrentY * FSlotHeight; } if ( W ) { *W = FSlotWidth; } if ( H ) { *H = FSlotHeight; } NextRect(); } private: void NextRect() { if ( ++FCurrentX >= FNumSlotsWidth ) { FCurrentX = 0; FCurrentY++; } } 


рд▓рдЧрднрдЧ (рд▓рдЧрднрдЧ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдордиреЗ 32-рдмрд┐рдЯ рдлреНрд▓реЛрдЯ рдХреА рджреВрд░реА рдХреЛ рдЕрд▓реНрдлрд╛ рд╕рд╣рд┐рдд 4 рдЪреИрдирд▓реЛрдВ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рд╣реИ), рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рдПрдЯрд▓рд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

рдЫрд╡рд┐

рдЕрдм рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрдпреВрдмрд┐рдХ рдорд╛рдирдЪрд┐рддреНрд░, рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреНрдпреВрдмреИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдмрдирд╛рд╡рдЯ рдПрдЯрд▓рд╕ рдХреЗ рднреАрддрд░ 3 рдбреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ 2 рдбреА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдирд┐рд░реНрджреЗрд╢рдХреЛрдВ рдХреЛ рд╕реАрдзреЗ рдЦрдВрдбрд┐рдд рдЫрд╛рдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдУрдкрди рдореИрдк 4.4 рдХреЛрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рд╕реЗ рдХреНрдпреВрдм рдореИрдк рдЯреЗрдХреНрд╕рдЪрд░ рдЪрдпрди рдХреЗ рдкреИрд░рд╛ 8.13 рдХреА рдУрд░ рдореБрдбрд╝реЗрдВред рддрд╛рд▓рд┐рдХрд╛ 8.18 рд╣рдореЗрдВ рдмрддрд╛рддреА рд╣реИ рдХрд┐ 3D рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ:

рдкреНрд░рдореБрдЦ рдЕрдХреНрд╖ рджрд┐рд╢рд╛рд▓рдХреНрд╖реНрдпрдЕрдиреБрд╕реВрдЪрд┐рдд рдЬрд╛рддрд┐Tcрдорд╛
+ рдЖрд░рдПрдХреНрд╕POSITIVE_X-Rz-RyрдЖрд░рдПрдХреНрд╕
-RxNEGATIVE_XRz-RyрдЖрд░рдПрдХреНрд╕
+ RyPOSITIVE_YрдЖрд░рдПрдХреНрд╕Rzry
-RyNEGATIVE_YрдЖрд░рдПрдХреНрд╕-Rzry
+ RzPOSITIVE_ZрдЖрд░рдПрдХреНрд╕-RyRz
-RzNEGATIVE_Z-Rx-RyRz


рд╣рдо рдЗрди рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд Sc, Tc рдФрд░ Ma рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ 2D рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ s, t рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 s = 0.5 * ( Sc / abs(Ma) + 1 ) t = 0.5 * ( Tc / abs(Ma) + 1 ) 


рдпрд╣рд╛рдБ GLSL shader рдХреЛрдб рд╣реИ рдЬреЛ рдмрдирд╛рд╡рдЯ рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк s рдФрд░ t рдХреЛ рдПрдЯрд▓рд╕ рдореЗрдВ рдзрдХреЗрд▓рддрд╛ рд╣реИ:

 vec2 GetShadowTC( vec3 Dir ) { float Sc; float Tc; float Ma; float FaceIndex; float rx = Dir.x; float ry = Dir.y; float rz = Dir.z; vec3 adir = abs(Dir); Ma = max( max( adir.x, adir.y ), adir.z ); if ( adir.x > adir.y && adir.x > adir.z ) { Sc = ( rx > 0.0 ) ? rz : -rz; Tc = ry; FaceIndex = ( rx > 0.0 ) ? 0.0 : 1.0; } else if ( adir.y > adir.x && adir.y > adir.z ) { Sc = rx; Tc = ( ry > 0.0 ) ? rz : -rz; FaceIndex = ( ry > 0.0 ) ? 2.0 : 3.0; } else { Sc = ( rz > 0.0 ) ? -rx : rx; Tc = ry; FaceIndex = ( rz > 0.0 ) ? 4.0 : 5.0; } float s = 0.5 * ( Sc / Ma + 1.0 ); float t = 0.5 * ( Tc / Ma + 1.0 ); //    s = s / 3.0; t = t / 2.0; float Flr = floor(FaceIndex / 3.0); float Rmd = FaceIndex - (3.0 * Flr); s += Rmd / 3.0; t += Flr / 2.0; return vec2( s, t ); } 


рджреГрд╢реНрдп рдореЗрдВ рд╣реА рдЫрд╛рдпрд╛ рдХреЛ рдЦреАрдВрдЪрдирд╛ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:

 float ComputePointLightShadow() { vec3 LightDirection = v_WorldPosition - u_LightPosition.xyz; vec2 IndirectTC = GetShadowTC( normalize( LightDirection ) ); vec4 Light = texture( Texture7, IndirectTC ); float LightD = Unpack( Light ) * 512.0; if ( LightD < length( LightDirection ) + u_ShadowDepthBias ) return u_ShadowIntensity; return 1.0; } float Unpack(vec4 Value) { const vec4 BitShifts = vec4( 1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0 ); return dot( Value, BitShifts ); } 


рд╡рд╣ рд╕рдм рд╣реИ!

рдЗрд╕ рддрдХрдиреАрдХ рдореЗрдВ рдмрдирд╛рд╡рдЯ рдХреЗ рдирдХреНрд╢реЗ рдХреА рд╕реАрдорд╛рдУрдВ рдкрд░ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдкреАрд╕реАрдПрдл рдЫрд╛рдпрд╛ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдпрд╛ рдЬреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдЯрд▓рд╕ рдХреЗ рдЕрдВрджрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрдирд╛рд╡рдЯ рдХреЗ рдмреАрдЪ рдПрдХ рдХрд╛рд▓реА рд╕реАрдорд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдбреЗрдореЛ


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ OpenGL ES 3.0 рдФрд░ Android 4.4 рд╡рд╛рд▓рд╛ Android рдЙрдкрдХрд░рдг рд╣реИ, рддреЛ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: play.google.com/store/apps/details?id=com.linderdaum.engine.vsdct

рд╕рдВрджрд░реНрдн



рд▓рд┐рдВрдбрд░рдбреИрдо рдЗрдВрдЬрди
ShaderX3: DirectX рдФрд░ OpenGL рдХреЗ рд╕рд╛рде рдЙрдиреНрдирдд рдкреНрд░рддрд┐рдкрд╛рджрди
рд╕рд░реНрд╡рджрд┐рд╢рд╛рддреНрдордХ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рд▓рд┐рдП рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА
рдУрдореНрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рд╢реИрдбреЛ рдФрд░ рд╡реАрдПрд╕рдбреАрд╕реАрдЯреА рдСрди рдУрдкрди ES 3
рдУрдордиреА-рджрд┐рд╢рд╛рддреНрдордХ рдЫрд╛рдпрд╛ рдорд╛рдирдЪрд┐рддреНрд░рдг

Source: https://habr.com/ru/post/In219327/


All Articles