bgfx/3rdparty/glsl-optimizer/tests/vertex/opt-matrix-transpose-mul-inES3.txt

84 lines
2 KiB
Text
Raw Normal View History

2014-10-11 15:32:43 -04:00
#version 300 es
uniform mat4 glstate_matrix_mvp;
in highp vec4 attrVertex;
in mediump vec3 attrNormal;
in mediump vec4 attrTangent;
mat3 xll_transpose(mat3 m) {
return mat3( m[0][0], m[1][0], m[2][0],
m[0][1], m[1][1], m[2][1],
m[0][2], m[1][2], m[2][2]);
}
mat3 xll_constructMat3(mat4 m) {
return mat3(vec3(m[0]), vec3(m[1]), vec3(m[2]));
}
struct v2f_surf {
highp vec4 pos;
lowp vec3 lightDir;
lowp vec3 viewDir;
lowp vec3 worldN;
};
struct appdata {
highp vec4 vertex;
mediump vec4 tangent;
mediump vec3 normal;
};
uniform highp mat4 _Object2World;
uniform highp mat4 _World2Object;
uniform highp vec3 _WorldSpaceCameraPos;
uniform lowp vec4 _WorldSpaceLightPos0;
uniform highp vec4 unity_Scale;
highp vec3 ObjSpaceViewDir( in highp vec4 v ) {
highp vec3 objSpaceCameraPos = (_World2Object * vec4(_WorldSpaceCameraPos.xyz, 1.0)).xyz * unity_Scale.w;
return objSpaceCameraPos - v.xyz;
}
highp vec3 ObjSpaceLightDir( in highp vec4 v ) {
highp vec3 objSpaceLightPos = (_World2Object * _WorldSpaceLightPos0).xyz;
return objSpaceLightPos.xyz;
}
v2f_surf vert_surf (in appdata v) {
v2f_surf o;
o.pos = glstate_matrix_mvp * v.vertex;
highp vec3 worldN = xll_constructMat3(_Object2World) * v.normal;
o.worldN = worldN;
mediump vec3 binormal = cross(v.normal, v.tangent.xyz) * v.tangent.w;
mediump mat3 rotation = xll_transpose (mat3(v.tangent.xyz, binormal, v.normal));
mediump vec3 lightDir = rotation * ObjSpaceLightDir(v.vertex);
o.lightDir = lightDir;
highp vec3 viewDirForLight = rotation * ObjSpaceViewDir(v.vertex);
o.viewDir = normalize( (lightDir + normalize( viewDirForLight )) );
return o;
}
out lowp vec3 varWorldN;
out lowp vec3 varLightDir;
out lowp vec3 varViewDir;
void main() {
appdata v;
v.vertex = attrVertex;
v.tangent = attrTangent;
v.normal = attrNormal;
v2f_surf rv = vert_surf(v);
gl_Position = rv.pos;
varWorldN = rv.worldN;
varLightDir = rv.lightDir;
varViewDir = rv.viewDir;
}