module Render.Unlit.Textured.Code ( vert , frag ) where import RIO import Render.Code (Code, glsl) import Render.DescSets.Set0.Code (set0binding0, set0binding1, set0binding2) vert :: Code vert = fromString [glsl| #version 450 ${set0binding0} // vertexPos layout(location = 0) in vec3 vPosition; // vertexAttrs layout(location = 1) in vec2 vTexCoord; // textureParams layout(location = 2) in vec4 iTextureScaleOffset; layout(location = 3) in vec4 iTextureGamma; layout(location = 4) in ivec2 iTextureIds; // transformMat layout(location = 5) in mat4 iModel; layout(location = 0) out vec2 fTexCoord; layout(location = 1) flat out vec4 fTextureGamma; layout(location = 2) flat out ivec2 fTextureIds; void main() { vec4 fPosition = iModel * vec4(vPosition, 1.0); gl_Position = scene.projection * scene.view * fPosition; fTexCoord = vTexCoord * iTextureScaleOffset.st + iTextureScaleOffset.pq; fTextureGamma = iTextureGamma; fTextureIds = iTextureIds; } |] frag :: Code frag = fromString [glsl| #version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_EXT_nonuniform_qualifier : enable ${set0binding1} ${set0binding2} layout(location = 0) in vec2 fTexCoord; layout(location = 1) flat in vec4 fTextureGamma; layout(location = 2) flat in ivec2 fTextureIds; layout(location = 0) out vec4 oColor; void main() { vec3 color = vec3(0); float combinedAlpha = 0; if (fTextureIds.t > -1 && fTextureIds.s > -1) { vec4 texel = texture( sampler2D( textures[nonuniformEXT(fTextureIds.t)], samplers[nonuniformEXT(fTextureIds.s)] ), fTexCoord ); color = pow(texel.rgb, fTextureGamma.rgb); combinedAlpha = texel.a * fTextureGamma.a; } // XXX: premultiply alpha due to additive blending oColor = vec4(color * combinedAlpha, combinedAlpha); } |]