From 2d2e2ff4038db052d0186645f5afe4ec9daf2505 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bruyère Date: Wed, 24 Apr 2019 04:17:16 +0200 Subject: use boolean for tex0 and tex1 availability tests --- samples/Pbr/shaders/filtercube.vert | 19 -- samples/Pbr/shaders/genbrdflut.frag | 90 ------- samples/Pbr/shaders/genbrdflut.vert | 9 - samples/Pbr/shaders/irradiancecube.frag | 37 --- samples/Pbr/shaders/pbr.vert | 58 ----- samples/Pbr/shaders/pbr_khr.frag | 415 ------------------------------- samples/Pbr/shaders/pbrtest.frag | 193 -------------- samples/Pbr/shaders/pbrtest.vert | 49 ---- samples/Pbr/shaders/prefilterenvmap.frag | 105 -------- samples/Pbr/shaders/skybox.frag | 15 -- samples/Pbr/shaders/skybox.vert | 30 --- samples/Pbr/shaders/skybox_sw.frag | 55 ---- samples/Pbr/shaders/skybox_sw.vert | 28 --- samples/Pbr/shaders/ui.frag | 13 - samples/Pbr/shaders/ui.vert | 25 -- 15 files changed, 1141 deletions(-) delete mode 100644 samples/Pbr/shaders/filtercube.vert delete mode 100644 samples/Pbr/shaders/genbrdflut.frag delete mode 100644 samples/Pbr/shaders/genbrdflut.vert delete mode 100644 samples/Pbr/shaders/irradiancecube.frag delete mode 100644 samples/Pbr/shaders/pbr.vert delete mode 100644 samples/Pbr/shaders/pbr_khr.frag delete mode 100644 samples/Pbr/shaders/pbrtest.frag delete mode 100644 samples/Pbr/shaders/pbrtest.vert delete mode 100644 samples/Pbr/shaders/prefilterenvmap.frag delete mode 100644 samples/Pbr/shaders/skybox.frag delete mode 100644 samples/Pbr/shaders/skybox.vert delete mode 100644 samples/Pbr/shaders/skybox_sw.frag delete mode 100644 samples/Pbr/shaders/skybox_sw.vert delete mode 100644 samples/Pbr/shaders/ui.frag delete mode 100644 samples/Pbr/shaders/ui.vert (limited to 'samples/Pbr/shaders') diff --git a/samples/Pbr/shaders/filtercube.vert b/samples/Pbr/shaders/filtercube.vert deleted file mode 100644 index 1226e28..0000000 --- a/samples/Pbr/shaders/filtercube.vert +++ /dev/null @@ -1,19 +0,0 @@ -#version 450 - -layout (location = 0) in vec3 inPos; - -layout(push_constant) uniform PushConsts { - layout (offset = 0) mat4 mvp; -} pushConsts; - -layout (location = 0) out vec3 outUVW; - -out gl_PerVertex { - vec4 gl_Position; -}; - -void main() -{ - outUVW = inPos; - gl_Position = pushConsts.mvp * vec4(inPos.xyz, 1.0); -} diff --git a/samples/Pbr/shaders/genbrdflut.frag b/samples/Pbr/shaders/genbrdflut.frag deleted file mode 100644 index b6290dd..0000000 --- a/samples/Pbr/shaders/genbrdflut.frag +++ /dev/null @@ -1,90 +0,0 @@ -#version 450 - -layout (location = 0) in vec2 inUV; -layout (location = 0) out vec4 outColor; -layout (constant_id = 0) const uint NUM_SAMPLES = 1024u; - -const float PI = 3.1415926536; - -// Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ -float random(vec2 co) -{ - float a = 12.9898; - float b = 78.233; - float c = 43758.5453; - float dt= dot(co.xy ,vec2(a,b)); - float sn= mod(dt,3.14); - return fract(sin(sn) * c); -} - -vec2 hammersley2d(uint i, uint N) -{ - // Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html - uint bits = (i << 16u) | (i >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - float rdi = float(bits) * 2.3283064365386963e-10; - return vec2(float(i) /float(N), rdi); -} - -// Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf -vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal) -{ - // Maps a 2D point to a hemisphere with spread based on roughness - float alpha = roughness * roughness; - float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1; - float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y)); - float sinTheta = sqrt(1.0 - cosTheta * cosTheta); - vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); - - // Tangent space - vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); - vec3 tangentX = normalize(cross(up, normal)); - vec3 tangentY = normalize(cross(normal, tangentX)); - - // Convert to world Space - return normalize(tangentX * H.x + tangentY * H.y + normal * H.z); -} - -// Geometric Shadowing function -float G_SchlicksmithGGX(float dotNL, float dotNV, float roughness) -{ - float k = (roughness * roughness) / 2.0; - float GL = dotNL / (dotNL * (1.0 - k) + k); - float GV = dotNV / (dotNV * (1.0 - k) + k); - return GL * GV; -} - -vec2 BRDF(float NoV, float roughness) -{ - // Normal always points along z-axis for the 2D lookup - const vec3 N = vec3(0.0, 0.0, 1.0); - vec3 V = vec3(sqrt(1.0 - NoV*NoV), 0.0, NoV); - - vec2 LUT = vec2(0.0); - for(uint i = 0u; i < NUM_SAMPLES; i++) { - vec2 Xi = hammersley2d(i, NUM_SAMPLES); - vec3 H = importanceSample_GGX(Xi, roughness, N); - vec3 L = 2.0 * dot(V, H) * H - V; - - float dotNL = max(dot(N, L), 0.0); - float dotNV = max(dot(N, V), 0.0); - float dotVH = max(dot(V, H), 0.0); - float dotNH = max(dot(H, N), 0.0); - - if (dotNL > 0.0) { - float G = G_SchlicksmithGGX(dotNL, dotNV, roughness); - float G_Vis = (G * dotVH) / (dotNH * dotNV); - float Fc = pow(1.0 - dotVH, 5.0); - LUT += vec2((1.0 - Fc) * G_Vis, Fc * G_Vis); - } - } - return LUT / float(NUM_SAMPLES); -} - -void main() -{ - outColor = vec4(BRDF(inUV.s, 1.0-inUV.t), 0.0, 1.0); -} \ No newline at end of file diff --git a/samples/Pbr/shaders/genbrdflut.vert b/samples/Pbr/shaders/genbrdflut.vert deleted file mode 100644 index f3dd233..0000000 --- a/samples/Pbr/shaders/genbrdflut.vert +++ /dev/null @@ -1,9 +0,0 @@ -#version 450 - -layout (location = 0) out vec2 outUV; - -void main() -{ - outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); - gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f); -} \ No newline at end of file diff --git a/samples/Pbr/shaders/irradiancecube.frag b/samples/Pbr/shaders/irradiancecube.frag deleted file mode 100644 index 3232db4..0000000 --- a/samples/Pbr/shaders/irradiancecube.frag +++ /dev/null @@ -1,37 +0,0 @@ -// Generates an irradiance cube from an environment map using convolution - -#version 450 - -layout (location = 0) in vec3 inPos; -layout (location = 0) out vec4 outColor; -layout (binding = 0) uniform samplerCube samplerEnv; - -layout(push_constant) uniform PushConsts { - layout (offset = 64) float deltaPhi; - layout (offset = 68) float deltaTheta; -} consts; - -#define PI 3.1415926535897932384626433832795 - -void main() -{ - vec3 N = normalize(inPos); - vec3 up = vec3(0.0, 1.0, 0.0); - vec3 right = normalize(cross(up, N)); - up = cross(N, right); - - const float TWO_PI = PI * 2.0; - const float HALF_PI = PI * 0.5; - - vec3 color = vec3(0.0); - uint sampleCount = 0u; - for (float phi = 0.0; phi < TWO_PI; phi += consts.deltaPhi) { - for (float theta = 0.0; theta < HALF_PI; theta += consts.deltaTheta) { - vec3 tempVec = cos(phi) * right + sin(phi) * up; - vec3 sampleVector = cos(theta) * N + sin(theta) * tempVec; - color += texture(samplerEnv, sampleVector).rgb * cos(theta) * sin(theta); - sampleCount++; - } - } - outColor = vec4(PI * color / float(sampleCount), 1.0); -} diff --git a/samples/Pbr/shaders/pbr.vert b/samples/Pbr/shaders/pbr.vert deleted file mode 100644 index 03d24da..0000000 --- a/samples/Pbr/shaders/pbr.vert +++ /dev/null @@ -1,58 +0,0 @@ -#version 450 - -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec2 inUV0; -layout (location = 3) in vec2 inUV1; -layout (location = 4) in vec4 inJoint0; -layout (location = 5) in vec4 inWeight0; - -layout (set = 0, binding = 0) uniform UBO -{ - mat4 projection; - mat4 model; - mat4 view; - vec3 camPos; -} ubo; - -#define MAX_NUM_JOINTS 128 - -layout (set = 2, binding = 0) uniform UBONode { - mat4 matrix; - mat4 jointMatrix[MAX_NUM_JOINTS]; - float jointCount; -} node; - -layout (location = 0) out vec3 outWorldPos; -layout (location = 1) out vec3 outNormal; -layout (location = 2) out vec2 outUV0; -layout (location = 3) out vec2 outUV1; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main() -{ - vec4 locPos; - if (node.jointCount > 0.0) { - // Mesh is skinned - mat4 skinMat = - inWeight0.x * node.jointMatrix[int(inJoint0.x)] + - inWeight0.y * node.jointMatrix[int(inJoint0.y)] + - inWeight0.z * node.jointMatrix[int(inJoint0.z)] + - inWeight0.w * node.jointMatrix[int(inJoint0.w)]; - - locPos = ubo.model * node.matrix * skinMat * vec4(inPos, 1.0); - outNormal = normalize(transpose(inverse(mat3(ubo.model * node.matrix * skinMat))) * inNormal); - } else { - locPos = ubo.model * node.matrix * vec4(inPos, 1.0); - outNormal = normalize(transpose(inverse(mat3(ubo.model * node.matrix))) * inNormal); - } - locPos.y = -locPos.y; - outWorldPos = locPos.xyz / locPos.w; - outUV0 = inUV0; - outUV1 = inUV1; - gl_Position = ubo.projection * ubo.view * vec4(outWorldPos, 1.0); -} diff --git a/samples/Pbr/shaders/pbr_khr.frag b/samples/Pbr/shaders/pbr_khr.frag deleted file mode 100644 index bdf9fce..0000000 --- a/samples/Pbr/shaders/pbr_khr.frag +++ /dev/null @@ -1,415 +0,0 @@ -// PBR shader based on the Khronos WebGL PBR implementation -// See https://github.com/KhronosGroup/glTF-WebGL-PBR -// Supports both metallic roughness and specular glossiness inputs - -#version 450 - -layout (location = 0) in vec3 inWorldPos; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec2 inUV0; -layout (location = 3) in vec2 inUV1; - -// Scene bindings - -layout (set = 0, binding = 0) uniform UBO { - mat4 projection; - mat4 model; - mat4 view; - vec3 camPos; -} ubo; - -layout (set = 0, binding = 1) uniform UBOParams { - vec4 lightDir; - float exposure; - float gamma; - float prefilteredCubeMipLevels; - float scaleIBLAmbient; - float debugViewInputs; - float debugViewEquation; -} uboParams; - -layout (set = 0, binding = 2) uniform samplerCube samplerIrradiance; -layout (set = 0, binding = 3) uniform samplerCube prefilteredMap; -layout (set = 0, binding = 4) uniform sampler2D samplerBRDFLUT; - -// Material bindings - -layout (set = 1, binding = 0) uniform sampler2D colorMap; -layout (set = 1, binding = 1) uniform sampler2D physicalDescriptorMap; -layout (set = 1, binding = 2) uniform sampler2D normalMap; -layout (set = 1, binding = 3) uniform sampler2D aoMap; -layout (set = 1, binding = 4) uniform sampler2D emissiveMap; - -layout (push_constant) uniform Material { - vec4 baseColorFactor; - vec4 emissiveFactor; - vec4 diffuseFactor; - vec4 specularFactor; - float workflow; - int baseColorTextureSet; - int physicalDescriptorTextureSet; - int normalTextureSet; - int occlusionTextureSet; - int emissiveTextureSet; - float metallicFactor; - float roughnessFactor; - float alphaMask; - float alphaMaskCutoff; -} material; - -layout (location = 0) out vec4 outColor; - -// Encapsulate the various inputs used by the various functions in the shading equation -// We store values in this struct to simplify the integration of alternative implementations -// of the shading terms, outlined in the Readme.MD Appendix. -struct PBRInfo -{ - float NdotL; // cos angle between normal and light direction - float NdotV; // cos angle between normal and view direction - float NdotH; // cos angle between normal and half vector - float LdotH; // cos angle between light direction and half vector - float VdotH; // cos angle between view direction and half vector - float perceptualRoughness; // roughness value, as authored by the model creator (input to shader) - float metalness; // metallic value at the surface - vec3 reflectance0; // full reflectance color (normal incidence angle) - vec3 reflectance90; // reflectance color at grazing angle - float alphaRoughness; // roughness mapped to a more linear change in the roughness (proposed by [2]) - vec3 diffuseColor; // color contribution from diffuse lighting - vec3 specularColor; // color contribution from specular lighting -}; - -const float M_PI = 3.141592653589793; -const float c_MinRoughness = 0.04; - -const float PBR_WORKFLOW_METALLIC_ROUGHNESS = 0.0; -const float PBR_WORKFLOW_SPECULAR_GLOSINESS = 1.0f; - -#define MANUAL_SRGB 1 - -vec3 Uncharted2Tonemap(vec3 color) -{ - float A = 0.15; - float B = 0.50; - float C = 0.10; - float D = 0.20; - float E = 0.02; - float F = 0.30; - float W = 11.2; - return ((color*(A*color+C*B)+D*E)/(color*(A*color+B)+D*F))-E/F; -} - -vec4 tonemap(vec4 color) -{ - vec3 outcol = Uncharted2Tonemap(color.rgb * uboParams.exposure); - outcol = outcol * (1.0f / Uncharted2Tonemap(vec3(11.2f))); - return vec4(pow(outcol, vec3(1.0f / uboParams.gamma)), color.a); -} - -vec4 SRGBtoLINEAR(vec4 srgbIn) -{ - #ifdef MANUAL_SRGB - #ifdef SRGB_FAST_APPROXIMATION - vec3 linOut = pow(srgbIn.xyz,vec3(2.2)); - #else //SRGB_FAST_APPROXIMATION - vec3 bLess = step(vec3(0.04045),srgbIn.xyz); - vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess ); - #endif //SRGB_FAST_APPROXIMATION - return vec4(linOut,srgbIn.w);; - #else //MANUAL_SRGB - return srgbIn; - #endif //MANUAL_SRGB -} - -// Find the normal for this fragment, pulling either from a predefined normal map -// or from the interpolated mesh normal and tangent attributes. -vec3 getNormal() -{ - // Perturb normal, see http://www.thetenthplanet.de/archives/1180 - vec3 tangentNormal = texture(normalMap, material.normalTextureSet == 0 ? inUV0 : inUV1).xyz * 2.0 - 1.0; - - vec3 q1 = dFdx(inWorldPos); - vec3 q2 = dFdy(inWorldPos); - vec2 st1 = dFdx(inUV0); - vec2 st2 = dFdy(inUV0); - - vec3 N = normalize(inNormal); - vec3 T = normalize(q1 * st2.t - q2 * st1.t); - vec3 B = -normalize(cross(N, T)); - mat3 TBN = mat3(T, B, N); - - return normalize(TBN * tangentNormal); -} - -// Calculation of the lighting contribution from an optional Image Based Light source. -// Precomputed Environment Maps are required uniform inputs and are computed as outlined in [1]. -// See our README.md on Environment Maps [3] for additional discussion. -vec3 getIBLContribution(PBRInfo pbrInputs, vec3 n, vec3 reflection) -{ - float lod = (pbrInputs.perceptualRoughness * uboParams.prefilteredCubeMipLevels); - // retrieve a scale and bias to F0. See [1], Figure 3 - vec3 brdf = (texture(samplerBRDFLUT, vec2(pbrInputs.NdotV, 1.0 - pbrInputs.perceptualRoughness))).rgb; - vec3 diffuseLight = SRGBtoLINEAR(tonemap(texture(samplerIrradiance, n))).rgb; - - vec3 specularLight = SRGBtoLINEAR(tonemap(textureLod(prefilteredMap, reflection, lod))).rgb; - - vec3 diffuse = diffuseLight * pbrInputs.diffuseColor; - vec3 specular = specularLight * (pbrInputs.specularColor * brdf.x + brdf.y); - - // For presentation, this allows us to disable IBL terms - // For presentation, this allows us to disable IBL terms - diffuse *= uboParams.scaleIBLAmbient; - specular *= uboParams.scaleIBLAmbient; - - return diffuse + specular; -} - -// Basic Lambertian diffuse -// Implementation from Lambert's Photometria https://archive.org/details/lambertsphotome00lambgoog -// See also [1], Equation 1 -vec3 diffuse(PBRInfo pbrInputs) -{ - return pbrInputs.diffuseColor / M_PI; -} - -// The following equation models the Fresnel reflectance term of the spec equation (aka F()) -// Implementation of fresnel from [4], Equation 15 -vec3 specularReflection(PBRInfo pbrInputs) -{ - return pbrInputs.reflectance0 + (pbrInputs.reflectance90 - pbrInputs.reflectance0) * pow(clamp(1.0 - pbrInputs.VdotH, 0.0, 1.0), 5.0); -} - -// This calculates the specular geometric attenuation (aka G()), -// where rougher material will reflect less light back to the viewer. -// This implementation is based on [1] Equation 4, and we adopt their modifications to -// alphaRoughness as input as originally proposed in [2]. -float geometricOcclusion(PBRInfo pbrInputs) -{ - float NdotL = pbrInputs.NdotL; - float NdotV = pbrInputs.NdotV; - float r = pbrInputs.alphaRoughness; - - float attenuationL = 2.0 * NdotL / (NdotL + sqrt(r * r + (1.0 - r * r) * (NdotL * NdotL))); - float attenuationV = 2.0 * NdotV / (NdotV + sqrt(r * r + (1.0 - r * r) * (NdotV * NdotV))); - return attenuationL * attenuationV; -} - -// The following equation(s) model the distribution of microfacet normals across the area being drawn (aka D()) -// Implementation from "Average Irregularity Representation of a Roughened Surface for Ray Reflection" by T. S. Trowbridge, and K. P. Reitz -// Follows the distribution function recommended in the SIGGRAPH 2013 course notes from EPIC Games [1], Equation 3. -float microfacetDistribution(PBRInfo pbrInputs) -{ - float roughnessSq = pbrInputs.alphaRoughness * pbrInputs.alphaRoughness; - float f = (pbrInputs.NdotH * roughnessSq - pbrInputs.NdotH) * pbrInputs.NdotH + 1.0; - return roughnessSq / (M_PI * f * f); -} - -// Gets metallic factor from specular glossiness workflow inputs -float convertMetallic(vec3 diffuse, vec3 specular, float maxSpecular) { - float perceivedDiffuse = sqrt(0.299 * diffuse.r * diffuse.r + 0.587 * diffuse.g * diffuse.g + 0.114 * diffuse.b * diffuse.b); - float perceivedSpecular = sqrt(0.299 * specular.r * specular.r + 0.587 * specular.g * specular.g + 0.114 * specular.b * specular.b); - if (perceivedSpecular < c_MinRoughness) { - return 0.0; - } - float a = c_MinRoughness; - float b = perceivedDiffuse * (1.0 - maxSpecular) / (1.0 - c_MinRoughness) + perceivedSpecular - 2.0 * c_MinRoughness; - float c = c_MinRoughness - perceivedSpecular; - float D = max(b * b - 4.0 * a * c, 0.0); - return clamp((-b + sqrt(D)) / (2.0 * a), 0.0, 1.0); -} - -void main() -{ - float perceptualRoughness; - float metallic; - vec3 diffuseColor; - vec4 baseColor; - - vec3 f0 = vec3(0.04); - - if (material.alphaMask == 1.0f) { - if (material.baseColorTextureSet > -1) { - baseColor = SRGBtoLINEAR(texture(colorMap, material.baseColorTextureSet == 0 ? inUV0 : inUV1)) * material.baseColorFactor; - } else { - baseColor = material.baseColorFactor; - } - if (baseColor.a < material.alphaMaskCutoff) { - discard; - } - } - - if (material.workflow == PBR_WORKFLOW_METALLIC_ROUGHNESS) { - // Metallic and Roughness material properties are packed together - // In glTF, these factors can be specified by fixed scalar values - // or from a metallic-roughness map - perceptualRoughness = material.roughnessFactor; - metallic = material.metallicFactor; - if (material.physicalDescriptorTextureSet > -1) { - // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel. - // This layout intentionally reserves the 'r' channel for (optional) occlusion map data - vec4 mrSample = texture(physicalDescriptorMap, material.physicalDescriptorTextureSet == 0 ? inUV0 : inUV1); - perceptualRoughness = mrSample.g * perceptualRoughness; - metallic = mrSample.b * metallic; - } else { - perceptualRoughness = clamp(perceptualRoughness, c_MinRoughness, 1.0); - metallic = clamp(metallic, 0.0, 1.0); - } - // Roughness is authored as perceptual roughness; as is convention, - // convert to material roughness by squaring the perceptual roughness [2]. - - // The albedo may be defined from a base texture or a flat color - if (material.baseColorTextureSet > -1) { - baseColor = SRGBtoLINEAR(texture(colorMap, material.baseColorTextureSet == 0 ? inUV0 : inUV1)) * material.baseColorFactor; - } else { - baseColor = material.baseColorFactor; - } - } - - if (material.workflow == PBR_WORKFLOW_SPECULAR_GLOSINESS) { - // Values from specular glossiness workflow are converted to metallic roughness - if (material.physicalDescriptorTextureSet > -1) { - perceptualRoughness = 1.0 - texture(physicalDescriptorMap, material.physicalDescriptorTextureSet == 0 ? inUV0 : inUV1).a; - } else { - perceptualRoughness = 0.0; - } - - const float epsilon = 1e-6; - - vec4 diffuse = SRGBtoLINEAR(texture(colorMap, inUV0)); - vec3 specular = SRGBtoLINEAR(texture(physicalDescriptorMap, inUV0)).rgb; - - float maxSpecular = max(max(specular.r, specular.g), specular.b); - - // Convert metallic value from specular glossiness inputs - metallic = convertMetallic(diffuse.rgb, specular, maxSpecular); - - vec3 baseColorDiffusePart = diffuse.rgb * ((1.0 - maxSpecular) / (1 - c_MinRoughness) / max(1 - metallic, epsilon)) * material.diffuseFactor.rgb; - vec3 baseColorSpecularPart = specular - (vec3(c_MinRoughness) * (1 - metallic) * (1 / max(metallic, epsilon))) * material.specularFactor.rgb; - baseColor = vec4(mix(baseColorDiffusePart, baseColorSpecularPart, metallic * metallic), diffuse.a); - - } - - diffuseColor = baseColor.rgb * (vec3(1.0) - f0); - diffuseColor *= 1.0 - metallic; - - float alphaRoughness = perceptualRoughness * perceptualRoughness; - - vec3 specularColor = mix(f0, baseColor.rgb, metallic); - - // Compute reflectance. - float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b); - - // For typical incident reflectance range (between 4% to 100%) set the grazing reflectance to 100% for typical fresnel effect. - // For very low reflectance range on highly diffuse objects (below 4%), incrementally reduce grazing reflecance to 0%. - float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0); - vec3 specularEnvironmentR0 = specularColor.rgb; - vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90; - - vec3 n = (material.normalTextureSet > -1) ? getNormal() : normalize(inNormal); - vec3 v = normalize(ubo.camPos - inWorldPos); // Vector from surface point to camera - vec3 l = normalize(uboParams.lightDir.xyz); // Vector from surface point to light - vec3 h = normalize(l+v); // Half vector between both l and v - vec3 reflection = -normalize(reflect(v, n)); - reflection.y *= -1.0f; - - float NdotL = clamp(dot(n, l), 0.001, 1.0); - float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0); - float NdotH = clamp(dot(n, h), 0.0, 1.0); - float LdotH = clamp(dot(l, h), 0.0, 1.0); - float VdotH = clamp(dot(v, h), 0.0, 1.0); - - PBRInfo pbrInputs = PBRInfo( - NdotL, - NdotV, - NdotH, - LdotH, - VdotH, - perceptualRoughness, - metallic, - specularEnvironmentR0, - specularEnvironmentR90, - alphaRoughness, - diffuseColor, - specularColor - ); - - // Calculate the shading terms for the microfacet specular shading model - vec3 F = specularReflection(pbrInputs); - float G = geometricOcclusion(pbrInputs); - float D = microfacetDistribution(pbrInputs); - - const vec3 u_LightColor = vec3(1.0); - - // Calculation of analytical lighting contribution - vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs); - vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV); - // Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law) - vec3 color = NdotL * u_LightColor * (diffuseContrib + specContrib); - - // Calculate lighting contribution from image based lighting source (IBL) - color += getIBLContribution(pbrInputs, n, reflection); - - const float u_OcclusionStrength = 1.0f; - // Apply optional PBR terms for additional (optional) shading - if (material.occlusionTextureSet > -1) { - float ao = texture(aoMap, (material.occlusionTextureSet == 0 ? inUV0 : inUV1)).r; - color = mix(color, color * ao, u_OcclusionStrength); - } - - const float u_EmissiveFactor = 1.0f; - if (material.emissiveTextureSet > -1) { - vec3 emissive = SRGBtoLINEAR(texture(emissiveMap, material.emissiveTextureSet == 0 ? inUV0 : inUV1)).rgb * u_EmissiveFactor; - color += emissive; - } - - outColor = vec4(color, baseColor.a); - - // Shader inputs debug visualization - if (uboParams.debugViewInputs > 0.0) { - int index = int(uboParams.debugViewInputs); - switch (index) { - case 1: - outColor.rgba = material.baseColorTextureSet > -1 ? texture(colorMap, material.baseColorTextureSet == 0 ? inUV0 : inUV1) : vec4(1.0f); - break; - case 2: - outColor.rgb = (material.normalTextureSet > -1) ? texture(normalMap, material.normalTextureSet == 0 ? inUV0 : inUV1).rgb : normalize(inNormal); - break; - case 3: - outColor.rgb = (material.occlusionTextureSet > -1) ? texture(aoMap, material.occlusionTextureSet == 0 ? inUV0 : inUV1).rrr : vec3(0.0f); - break; - case 4: - outColor.rgb = (material.emissiveTextureSet > -1) ? texture(emissiveMap, material.emissiveTextureSet == 0 ? inUV0 : inUV1).rgb : vec3(0.0f); - break; - case 5: - outColor.rgb = texture(physicalDescriptorMap, inUV0).bbb; - break; - case 6: - outColor.rgb = texture(physicalDescriptorMap, inUV0).ggg; - break; - } - outColor = SRGBtoLINEAR(outColor); - } - - // PBR equation debug visualization - // "none", "Diff (l,n)", "F (l,h)", "G (l,v,h)", "D (h)", "Specular" - if (uboParams.debugViewEquation > 0.0) { - int index = int(uboParams.debugViewEquation); - switch (index) { - case 1: - outColor.rgb = diffuseContrib; - break; - case 2: - outColor.rgb = F; - break; - case 3: - outColor.rgb = vec3(G); - break; - case 4: - outColor.rgb = vec3(D); - break; - case 5: - outColor.rgb = specContrib; - break; - } - } - -} diff --git a/samples/Pbr/shaders/pbrtest.frag b/samples/Pbr/shaders/pbrtest.frag deleted file mode 100644 index 4325601..0000000 --- a/samples/Pbr/shaders/pbrtest.frag +++ /dev/null @@ -1,193 +0,0 @@ -#version 450 - -#extension GL_ARB_separate_shader_objects : enable -#extension GL_ARB_shading_language_420pack : enable - -layout (binding = 0) uniform UBO -{ - mat4 projectionMatrix; - mat4 viewMatrix; - mat4 modelMatrix; - vec4 lightPos; - float gamma; - float exposure; -} ubo; - -layout (set = 0, binding = 1) uniform samplerCube samplerCubemap; - -layout (set = 1, binding = 0) uniform sampler2D samplerColor; -layout (set = 1, binding = 1) uniform sampler2D samplerNormal; -layout (set = 1, binding = 2) uniform sampler2D samplerOcclusion; -layout (set = 1, binding = 3) uniform sampler2D samplerMetalRoughness; -layout (set = 1, binding = 4) uniform sampler2D samplerEmissive; - -layout (location = 0) in vec2 inUV; -layout (location = 1) in vec3 inN; -layout (location = 2) in vec3 inV; -layout (location = 3) in vec3 inWorldPos; - -layout (location = 0) out vec4 outFragColor; - -layout(push_constant) uniform PushConsts { - layout(offset = 64) - vec4 baseColorFactor; - vec4 emissiveFactor; - uint availableAttachments; - uint alphaMode; - float alphaCutoff; - float metallicFactor; - float roughnessFactor; -} pc; - -const uint MAP_COLOR = 0x1; -const uint MAP_NORMAL = 0x2; -const uint MAP_AO = 0x4; -const uint MAP_METAL = 0x8; -const uint MAP_ROUGHNESS = 0x16; -const uint MAP_METALROUGHNESS = 0x32; -const uint MAP_EMISSIVE = 0x64; - -const float PI = 3.141592653589793; - -// From http://filmicgames.com/archives/75 -vec3 Uncharted2Tonemap(vec3 x) -{ - float A = 0.15; - float B = 0.50; - float C = 0.10; - float D = 0.20; - float E = 0.02; - float F = 0.30; - return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F; -} - -// Normal Distribution function -------------------------------------- -float D_GGX(float dotNH, float roughness) -{ - float alpha = roughness * roughness; - float alpha2 = alpha * alpha; - float denom = dotNH * dotNH * (alpha2 - 1.0) + 1.0; - return (alpha2)/(PI * denom*denom); -} - -// Geometric Shadowing function -------------------------------------- -float G_SchlicksmithGGX(float dotNL, float dotNV, float roughness) -{ - float r = (roughness + 1.0); - float k = (r*r) / 8.0; - float GL = dotNL / (dotNL * (1.0 - k) + k); - float GV = dotNV / (dotNV * (1.0 - k) + k); - return GL * GV; -} - -// Fresnel function ---------------------------------------------------- -vec3 F_Schlick(float cosTheta, vec3 F0) -{ - return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0); -} -vec3 F_SchlickR(float cosTheta, vec3 F0, float roughness) -{ - return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1.0 - cosTheta, 5.0); -} - -vec3 specularContribution(vec3 L, vec3 V, vec3 N, vec3 F0, float metallic, float roughness, vec3 albedo) -{ - // Precalculate vectors and dot products - vec3 H = normalize (V + L); - float dotNH = clamp(dot(N, H), 0.0, 1.0); - float dotNV = clamp(dot(N, V), 0.0, 1.0); - float dotNL = clamp(dot(N, L), 0.0, 1.0); - - // Light color fixed - vec3 lightColor = vec3(1.0); - - vec3 color = vec3(0.0); - - if (dotNL > 0.0) { - // D = Normal distribution (Distribution of the microfacets) - float D = D_GGX(dotNH, roughness); - // G = Geometric shadowing term (Microfacets shadowing) - float G = G_SchlicksmithGGX(dotNL, dotNV, roughness); - // F = Fresnel factor (Reflectance depending on angle of incidence) - vec3 F = F_Schlick(dotNV, F0); - vec3 spec = D * F * G / (4.0 * dotNL * dotNV + 0.001); - vec3 kD = (vec3(1.0) - F) * (1.0 - metallic); - color += (kD * albedo / PI + spec) * dotNL; - } - - return color; -} - -// See http://www.thetenthplanet.de/archives/1180 -vec3 perturbNormal(vec3 inNormal, vec3 tangentNormal) -{ - - - vec3 q1 = dFdx(inWorldPos); - vec3 q2 = dFdy(inWorldPos); - vec2 st1 = dFdx(inUV); - vec2 st2 = dFdy(inUV); - - vec3 N = normalize(inNormal); - vec3 T = normalize(q1 * st2.t - q2 * st1.t); - vec3 B = -normalize(cross(N, T)); - mat3 TBN = mat3(T, B, N); - - return normalize(TBN * tangentNormal); -} -void main() -{ - vec3 emit = vec3(0); - vec4 base_color = pc.baseColorFactor; - float rough = pc.roughnessFactor; - float metallic = pc.metallicFactor; - - if ((pc.availableAttachments & MAP_COLOR) == MAP_COLOR) - base_color *= texture(samplerColor, inUV); - if ((pc.availableAttachments & MAP_METALROUGHNESS) == MAP_METALROUGHNESS) { - rough *= clamp(texture(samplerMetalRoughness, inUV).g, 0.04, 1.0); - metallic *= texture(samplerMetalRoughness, inUV).b; - } - if ((pc.availableAttachments & MAP_EMISSIVE) == MAP_EMISSIVE) - emit = pc.emissiveFactor.rgb * texture(samplerEmissive, inUV).rgb; - - - vec3 N = ((pc.availableAttachments & MAP_NORMAL) == MAP_NORMAL) ? - perturbNormal(inN, texture(samplerNormal, inUV).xyz * 2.0 - 1.0) : - normalize(inN); - vec3 V = normalize(inV); - vec3 R = -normalize(reflect(V, N)); - - vec3 F0 = vec3(0.04); - F0 = mix(F0, base_color.rgb, metallic); - float alpha = pow(rough, 2.0); - - vec3 L = normalize(ubo.lightPos.xyz); - vec3 Lo = specularContribution(L, V, N, F0, metallic, rough, base_color.rgb); - - vec3 reflection = texture(samplerCubemap, R).rgb * (1.0-rough);//vec3(rough); - vec3 irradiance = vec3(0.8);//texture(samplerIrradiance, N).rgb; - - // Diffuse based on irradiance - vec3 diffuse = irradiance * base_color.rgb; - - vec3 F = F_SchlickR(max(dot(N, V), 0.0), F0, rough); - - vec3 specular = reflection * F;//(F * brdf.x + brdf.y); - - // Ambient part - vec3 kD = 1.0 - F; - kD *= 1.0 - metallic; - - float ao = ((pc.availableAttachments & MAP_AO) == MAP_AO) ? texture(samplerOcclusion, inUV).r : 1.0f; - vec3 ambient = (kD * diffuse + specular) * ao; - vec3 color = ambient + Lo; - - // Tone mapping - color = Uncharted2Tonemap(color * ubo.exposure); - color = color * (1.0f / Uncharted2Tonemap(vec3(11.2f))); - // Gamma correction - color = pow(color, vec3(1.0f / ubo.gamma)) + emit; - - outFragColor = vec4(color , base_color.a); -} \ No newline at end of file diff --git a/samples/Pbr/shaders/pbrtest.vert b/samples/Pbr/shaders/pbrtest.vert deleted file mode 100644 index 25907bb..0000000 --- a/samples/Pbr/shaders/pbrtest.vert +++ /dev/null @@ -1,49 +0,0 @@ -#version 450 - -#extension GL_ARB_separate_shader_objects : enable -#extension GL_ARB_shading_language_420pack : enable - -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec2 inUV; - -layout (binding = 0) uniform UBO -{ - mat4 projectionMatrix; - mat4 viewMatrix; - mat4 modelMatrix; - vec4 lightPos; - float gamma; - float exposure; -} ubo; - -layout (location = 0) out vec2 outUV; -layout (location = 1) out vec3 outN; -layout (location = 2) out vec3 outV;//ViewDir -layout (location = 3) out vec3 outWorldPos; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -layout(push_constant) uniform PushConsts { - mat4 model; -} pc; - -void main() -{ - outUV = inUV; - - mat4 mod = ubo.modelMatrix * pc.model; - vec4 pos = mod * vec4(inPos.xyz, 1.0); - - outN = normalize(transpose(inverse(mat3(mod))) * inNormal); - //outN = normalize(mat3(mod)* inNormal); - - mat4 viewInv = inverse(ubo.viewMatrix); - //outV = -(ubo.viewMatrix * pos).xyz; - outV = normalize(vec3(viewInv * vec4(0.0, 0.0, 0.0, 1.0) - pos)); - outWorldPos = pos.xyz; - gl_Position = ubo.projectionMatrix * ubo.viewMatrix * pos; -} diff --git a/samples/Pbr/shaders/prefilterenvmap.frag b/samples/Pbr/shaders/prefilterenvmap.frag deleted file mode 100644 index ae1212e..0000000 --- a/samples/Pbr/shaders/prefilterenvmap.frag +++ /dev/null @@ -1,105 +0,0 @@ -#version 450 - -layout (location = 0) in vec3 inPos; -layout (location = 0) out vec4 outColor; - -layout (binding = 0) uniform samplerCube samplerEnv; - -layout(push_constant) uniform PushConsts { - layout (offset = 64) float roughness; - layout (offset = 68) uint numSamples; -} consts; - -const float PI = 3.1415926536; - -// Based omn http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ -float random(vec2 co) -{ - float a = 12.9898; - float b = 78.233; - float c = 43758.5453; - float dt= dot(co.xy ,vec2(a,b)); - float sn= mod(dt,3.14); - return fract(sin(sn) * c); -} - -vec2 hammersley2d(uint i, uint N) -{ - // Radical inverse based on http://holger.dammertz.org/stuff/notes_HammersleyOnHemisphere.html - uint bits = (i << 16u) | (i >> 16u); - bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u); - bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u); - bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u); - bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u); - float rdi = float(bits) * 2.3283064365386963e-10; - return vec2(float(i) /float(N), rdi); -} - -// Based on http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_slides.pdf -vec3 importanceSample_GGX(vec2 Xi, float roughness, vec3 normal) -{ - // Maps a 2D point to a hemisphere with spread based on roughness - float alpha = roughness * roughness; - float phi = 2.0 * PI * Xi.x + random(normal.xz) * 0.1; - float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (alpha*alpha - 1.0) * Xi.y)); - float sinTheta = sqrt(1.0 - cosTheta * cosTheta); - vec3 H = vec3(sinTheta * cos(phi), sinTheta * sin(phi), cosTheta); - - // Tangent space - vec3 up = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); - vec3 tangentX = normalize(cross(up, normal)); - vec3 tangentY = normalize(cross(normal, tangentX)); - - // Convert to world Space - return normalize(tangentX * H.x + tangentY * H.y + normal * H.z); -} - -// Normal Distribution function -float D_GGX(float dotNH, float roughness) -{ - float alpha = roughness * roughness; - float alpha2 = alpha * alpha; - float denom = dotNH * dotNH * (alpha2 - 1.0) + 1.0; - return (alpha2)/(PI * denom*denom); -} - -vec3 prefilterEnvMap(vec3 R, float roughness) -{ - vec3 N = R; - vec3 V = R; - vec3 color = vec3(0.0); - float totalWeight = 0.0; - float envMapDim = float(textureSize(samplerEnv, 0).s); - for(uint i = 0u; i < consts.numSamples; i++) { - vec2 Xi = hammersley2d(i, consts.numSamples); - vec3 H = importanceSample_GGX(Xi, roughness, N); - vec3 L = 2.0 * dot(V, H) * H - V; - float dotNL = clamp(dot(N, L), 0.0, 1.0); - if(dotNL > 0.0) { - // Filtering based on https://placeholderart.wordpress.com/2015/07/28/implementation-notes-runtime-environment-map-filtering-for-image-based-lighting/ - - float dotNH = clamp(dot(N, H), 0.0, 1.0); - float dotVH = clamp(dot(V, H), 0.0, 1.0); - - // Probability Distribution Function - float pdf = D_GGX(dotNH, roughness) * dotNH / (4.0 * dotVH) + 0.0001; - // Slid angle of current smple - float omegaS = 1.0 / (float(consts.numSamples) * pdf); - // Solid angle of 1 pixel across all cube faces - float omegaP = 4.0 * PI / (6.0 * envMapDim * envMapDim); - // Biased (+1.0) mip level for better result - float mipLevel = roughness == 0.0 ? 0.0 : max(0.5 * log2(omegaS / omegaP) + 1.0, 0.0f); - color += textureLod(samplerEnv, L, mipLevel).rgb * dotNL; - totalWeight += dotNL; - - } - } - return (color / totalWeight); -} - - -void main() -{ - vec3 N = normalize(inPos); - outColor = vec4(prefilterEnvMap(N, consts.roughness), 1.0); -} diff --git a/samples/Pbr/shaders/skybox.frag b/samples/Pbr/shaders/skybox.frag deleted file mode 100644 index fa10f82..0000000 --- a/samples/Pbr/shaders/skybox.frag +++ /dev/null @@ -1,15 +0,0 @@ -#version 450 - -#extension GL_ARB_separate_shader_objects : enable -#extension GL_ARB_shading_language_420pack : enable - -layout (binding = 1) uniform samplerCube skybox; - -layout (location = 0) in vec3 TexCoords; - -layout (location = 0) out vec4 outFragColor; - -void main() -{ - outFragColor = texture(skybox, TexCoords); -} diff --git a/samples/Pbr/shaders/skybox.vert b/samples/Pbr/shaders/skybox.vert deleted file mode 100644 index 1925ec9..0000000 --- a/samples/Pbr/shaders/skybox.vert +++ /dev/null @@ -1,30 +0,0 @@ -#version 450 - -#extension GL_ARB_separate_shader_objects : enable -#extension GL_ARB_shading_language_420pack : enable - -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUV; - -layout (location = 0) out vec3 outUVW; - -layout (binding = 0) uniform UBO -{ - mat4 projection; - mat4 view; - mat4 model; - vec4 lightPos; - float gamma; - float exposure; -} ubo; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main() -{ - outUVW = inPos; - gl_Position = ubo.projection * ubo.view * vec4(inPos, 1.0); -} diff --git a/samples/Pbr/shaders/skybox_sw.frag b/samples/Pbr/shaders/skybox_sw.frag deleted file mode 100644 index a861ec4..0000000 --- a/samples/Pbr/shaders/skybox_sw.frag +++ /dev/null @@ -1,55 +0,0 @@ -#version 450 - -layout (binding = 2) uniform samplerCube samplerEnv; - -layout (location = 0) in vec3 inUVW; -layout (location = 0) out vec4 outColor; - -layout (set = 0, binding = 1) uniform UBOParams { - vec4 _pad0; - float exposure; - float gamma; -} uboParams; - -// From http://filmicworlds.com/blog/filmic-tonemapping-operators/ -vec3 Uncharted2Tonemap(vec3 color) -{ - float A = 0.15; - float B = 0.50; - float C = 0.10; - float D = 0.20; - float E = 0.02; - float F = 0.30; - float W = 11.2; - return ((color*(A*color+C*B)+D*E)/(color*(A*color+B)+D*F))-E/F; -} - -vec4 tonemap(vec4 color) -{ - vec3 outcol = Uncharted2Tonemap(color.rgb * uboParams.exposure); - outcol = outcol * (1.0f / Uncharted2Tonemap(vec3(11.2f))); - return vec4(pow(outcol, vec3(1.0f / uboParams.gamma)), color.a); -} - -#define MANUAL_SRGB 1 - -vec4 SRGBtoLINEAR(vec4 srgbIn) -{ - #ifdef MANUAL_SRGB - #ifdef SRGB_FAST_APPROXIMATION - vec3 linOut = pow(srgbIn.xyz,vec3(2.2)); - #else //SRGB_FAST_APPROXIMATION - vec3 bLess = step(vec3(0.04045),srgbIn.xyz); - vec3 linOut = mix( srgbIn.xyz/vec3(12.92), pow((srgbIn.xyz+vec3(0.055))/vec3(1.055),vec3(2.4)), bLess ); - #endif //SRGB_FAST_APPROXIMATION - return vec4(linOut,srgbIn.w);; - #else //MANUAL_SRGB - return srgbIn; - #endif //MANUAL_SRGB -} - -void main() -{ - vec3 color = SRGBtoLINEAR(tonemap(textureLod(samplerEnv, inUVW, 1.5))).rgb; - outColor = vec4(color * 1.0, 1.0); -} \ No newline at end of file diff --git a/samples/Pbr/shaders/skybox_sw.vert b/samples/Pbr/shaders/skybox_sw.vert deleted file mode 100644 index c51c4b5..0000000 --- a/samples/Pbr/shaders/skybox_sw.vert +++ /dev/null @@ -1,28 +0,0 @@ -#version 450 - -#extension GL_ARB_separate_shader_objects : enable -#extension GL_ARB_shading_language_420pack : enable - -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec3 inNormal; -layout (location = 2) in vec2 inUV; - -layout (binding = 0) uniform UBO -{ - mat4 projection; - mat4 pad; - mat4 model; -} ubo; - -layout (location = 0) out vec3 outUVW; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main() -{ - outUVW = inPos; - gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); -} diff --git a/samples/Pbr/shaders/ui.frag b/samples/Pbr/shaders/ui.frag deleted file mode 100644 index e0d7995..0000000 --- a/samples/Pbr/shaders/ui.frag +++ /dev/null @@ -1,13 +0,0 @@ -#version 450 - -layout (binding = 0) uniform sampler2D fontSampler; - -layout (location = 0) in vec2 inUV; -layout (location = 1) in vec4 inColor; - -layout (location = 0) out vec4 outColor; - -void main() -{ - outColor = inColor * texture(fontSampler, inUV); -} \ No newline at end of file diff --git a/samples/Pbr/shaders/ui.vert b/samples/Pbr/shaders/ui.vert deleted file mode 100644 index ddb63a4..0000000 --- a/samples/Pbr/shaders/ui.vert +++ /dev/null @@ -1,25 +0,0 @@ -#version 450 - -layout (location = 0) in vec2 inPos; -layout (location = 1) in vec2 inUV; -layout (location = 2) in vec4 inColor; - -layout (push_constant) uniform PushConstants { - vec2 scale; - vec2 translate; -} pushConstants; - -layout (location = 0) out vec2 outUV; -layout (location = 1) out vec4 outColor; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main() -{ - outUV = inUV; - outColor = inColor; - gl_Position = vec4(inPos * pushConstants.scale + pushConstants.translate, 0.0, 1.0); -} \ No newline at end of file -- cgit v1.3.1-4-g156e