keid-render-basic-0.1.7.0: src/Render/Unlit/Textured/Code.hs
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);
}
|]