mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-12-01 11:56:58 -05:00
134 lines
5 KiB
Text
134 lines
5 KiB
Text
#version 300 es
|
|
|
|
// stripped down version of Nicholas' Static Sky
|
|
// hybrid lighting shader that exposed vector_insert_todo
|
|
// bug
|
|
|
|
#define gl_Vertex _glesVertex
|
|
in vec4 _glesVertex;
|
|
#define gl_Color _glesColor
|
|
in vec4 _glesColor;
|
|
#define gl_Normal _glesNormal
|
|
in vec3 _glesNormal;
|
|
#define gl_MultiTexCoord0 _glesMultiTexCoord0
|
|
in vec4 _glesMultiTexCoord0;
|
|
#define gl_MultiTexCoord1 _glesMultiTexCoord1
|
|
in vec4 _glesMultiTexCoord1;
|
|
#define TANGENT _glesTANGENT
|
|
in vec4 _glesTANGENT;
|
|
vec4 xll_tex2Dlod(sampler2D s, vec4 coord) {
|
|
return textureLod( s, coord.xy, coord.w);
|
|
}
|
|
struct Lamp {
|
|
mediump vec4 posRange;
|
|
mediump vec4 colorImp;
|
|
};
|
|
struct v2f {
|
|
highp vec4 pos;
|
|
mediump vec3 diffuse;
|
|
};
|
|
struct HybridAppData {
|
|
highp vec4 vertex;
|
|
highp vec4 tangent;
|
|
highp vec3 normal;
|
|
highp vec4 texcoord;
|
|
lowp vec4 bakedCol;
|
|
mediump vec2 bakedDir;
|
|
};
|
|
uniform highp vec3 _WorldSpaceCameraPos;
|
|
uniform highp vec4 _ProjectionParams;
|
|
uniform highp vec4 _ScreenParams;
|
|
uniform highp vec4 _ZBufferParams;
|
|
uniform highp vec4 _WorldSpaceLightPos0;
|
|
uniform highp mat4 glstate_matrix_mvp;
|
|
uniform highp mat4 glstate_matrix_modelview0;
|
|
uniform highp mat4 glstate_matrix_invtrans_modelview0;
|
|
uniform highp mat4 _Object2World;
|
|
uniform highp mat4 _World2Object;
|
|
uniform highp mat4 glstate_matrix_transpose_modelview0;
|
|
uniform highp mat4 glstate_matrix_projection;
|
|
uniform lowp vec4 glstate_lightmodel_ambient;
|
|
uniform highp float _RenderExposure;
|
|
uniform mediump vec2 _DynLampInfo_bufferSize;
|
|
uniform sampler2D _DynLampInfo;
|
|
uniform highp float LightVertOffset;
|
|
uniform sampler2D LightVertTexture;
|
|
uniform highp vec4 LightVertTextureSize;
|
|
void CalcDynamicLight( in highp vec3 worldVert, in highp vec3 worldNorm, in Lamp lamp[4], inout mediump vec3 hybridDir, inout mediump vec3 hybridCol ) {
|
|
mediump vec4 atten;
|
|
highp int i = 0;
|
|
for ( ; (i < 4); (i++)) {
|
|
|
|
highp vec3 lightToVert = (lamp[i].posRange.xyz - worldVert);
|
|
highp float lengthSq = dot( lightToVert, lightToVert);
|
|
highp vec3 lightToVertNorm = (lightToVert * inversesqrt(lengthSq));
|
|
|
|
atten[i] = (lengthSq * lamp[i].posRange.w);
|
|
mediump float nDotL = dot( lightToVertNorm, worldNorm);
|
|
mediump float weight = (atten[i] * nDotL);
|
|
}
|
|
|
|
highp int j = 0;
|
|
for ( ; (j < 4); (j++)) {
|
|
hybridCol += (lamp[j].colorImp.xyz * atten[j]);
|
|
}
|
|
}
|
|
void LoadBakedLight( out mediump vec3 hybridCol, out mediump vec3 hybridDir ) {
|
|
}
|
|
mediump vec4 DoSampleGPUBuffer( in sampler2D buffer, in mediump vec2 coord, in mediump vec2 dimensions ) {
|
|
return xll_tex2Dlod( buffer, vec4( (coord / dimensions), 0.0, 0.0));
|
|
}
|
|
void ReadLightArray3( in highp ivec4 lightIdx, out Lamp l0, out Lamp l1, out Lamp l2, out Lamp l3 ) {
|
|
|
|
l0.posRange = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.x), 1.0), _DynLampInfo_bufferSize);
|
|
l0.colorImp = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.x), 2.0), _DynLampInfo_bufferSize);
|
|
l1.posRange = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.y), 1.0), _DynLampInfo_bufferSize);
|
|
|
|
l1.colorImp = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.y), 2.0), _DynLampInfo_bufferSize);
|
|
l2.posRange = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.z), 1.0), _DynLampInfo_bufferSize);
|
|
l2.colorImp = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.z), 2.0), _DynLampInfo_bufferSize);
|
|
|
|
l3.posRange = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.w), 1.0), _DynLampInfo_bufferSize);
|
|
l3.colorImp = DoSampleGPUBuffer( _DynLampInfo, vec2( float(lightIdx.w), 2.0), _DynLampInfo_bufferSize);
|
|
}
|
|
void DoCalcHybridLight2( in highp vec3 worldVert, in highp vec3 worldNorm, out mediump vec3 hybridCol, in lowp vec4 bakedColor, in mediump vec2 bakedDir ) {
|
|
mediump vec3 hybridDir;
|
|
LoadBakedLight( hybridCol, hybridDir);
|
|
|
|
highp ivec4 lightIdx = ivec4( int(worldVert.x), int(worldVert.y), int(worldVert.z), int((-worldVert.x)));
|
|
Lamp l[4];
|
|
ReadLightArray3( lightIdx, l[0], l[1], l[2], l[3]);
|
|
|
|
CalcDynamicLight( worldVert, worldNorm, l, hybridDir, hybridCol);
|
|
}
|
|
highp vec3 CalcDiffuseHybridLight( in highp vec3 worldVert, in highp vec3 worldNorm, in mediump vec4 bakedColor, in mediump vec2 bakedDir ) {
|
|
mediump vec3 hybridCol;
|
|
DoCalcHybridLight2( worldVert, worldNorm, hybridCol, bakedColor, bakedDir);
|
|
|
|
return hybridCol;
|
|
}
|
|
v2f vert( in HybridAppData v ) {
|
|
v2f o;
|
|
|
|
highp vec3 worldVert = (_Object2World * v.vertex).xyz;
|
|
highp vec3 worldNorm = normalize((mat3( _Object2World) * v.normal.xyz));
|
|
o.diffuse = CalcDiffuseHybridLight( worldVert, worldNorm, v.bakedCol, v.bakedDir);
|
|
|
|
o.pos = (glstate_matrix_mvp * v.vertex);
|
|
return o;
|
|
}
|
|
|
|
out mediump vec3 xlv_TEXCOORD2;
|
|
void main() {
|
|
v2f xl_retval;
|
|
HybridAppData xlt_v;
|
|
xlt_v.vertex = vec4(gl_Vertex);
|
|
xlt_v.tangent = vec4(TANGENT);
|
|
xlt_v.normal = vec3(gl_Normal);
|
|
xlt_v.texcoord = vec4(gl_MultiTexCoord0);
|
|
xlt_v.bakedCol = vec4(gl_Color);
|
|
xlt_v.bakedDir = vec2(gl_MultiTexCoord1);
|
|
xl_retval = vert( xlt_v);
|
|
gl_Position = vec4(xl_retval.pos);
|
|
xlv_TEXCOORD2 = vec3(xl_retval.diffuse);
|
|
}
|