#ifdef DESC [program] type: graphics vertex: main fragment: main [binding] name: mesh rate: vertex [attribute] name: position type: vec3 [attribute] name: normal type: vec3 [attribute] name: tangent type: vec3 [attribute] name: uv type: vec2 [interpolator] name: uv type: vec2 [interpolator] name: position type: vec4 [interpolator] name: normal type: vec3 [interpolator] name: tbn type: mat3 [struct] name: MVP [variable] name: model type: mat4 [variable] name: view_projection type: mat4 [struct] name: Material [variable] name: albedo type: vec3 [variable] name: metalness type: float [variable] name: roughness type: float [variable] name: ao type: float [cbuffer] name: c_mvp type: MVP stage: vertex [cbuffer] name: material type: Material stage: fragment [texture] name: albedo stage: fragment dimension: 2 [texture] name: ao stage: fragment dimension: 2 [texture] name: metal stage: fragment dimension: 2 [texture] name: rough stage: fragment dimension: 2 [texture] name: normal stage: fragment dimension: 2 [target] name: colour type: vec4 #endif #ifdef VERTEX_SHADER void main() { vec4 pos = c_mvp.model * vec4(position, 1.0); vec3 t = normalize((c_mvp.model * vec4(tangent, 0.0)).xyz); vec3 n = normalize((c_mvp.model * vec4(normal, 0.0)).xyz); vec3 b = cross(t, n); interpolator.normal = n; interpolator.tbn = mat3(t, b, n); interpolator.uv = uv; interpolator.position = pos; interpolator.tbn = mat3(t, b, n); gl_Position = c_mvp.view_projection * pos; } #endif #ifdef FRAGMENT_SHADER void main() { vec2 uv = interpolator.uv; vec3 nrmsample = texture(normal, uv).rgb; vec2 nrmxy = nrmsample.xy * 2.0 - 1.0; vec3 nrm = normalize(vec3(nrmxy, 1.0)); if (nrmsample.b == 1.0) /* default texture */ nrm = vec3(0, 0, 1); nrm = normalize(interpolator.tbn * nrm); float light = max(dot(nrm, vec3(0, 0, 1)), 0.0); vec3 ambient = 0.05.xxx * texture(ao, uv).r; vec3 col = ambient + light * material.albedo; col *= texture(albedo, uv).rgb; colour = vec4(col, 1.0); } #endif