169 lines
4.2 KiB
C++
169 lines
4.2 KiB
C++
|
/*
|
||
|
New File;;;;
|
||
|
Stuff
|
||
|
*/
|
||
|
|
||
|
inline void
|
||
|
GLSL_InitSpriteSheetProgram(memory_arena *Arena, glsl_program *TheSpriteSheetProgram)
|
||
|
{
|
||
|
// s32 VertexAttributeCount = ArrayCount(VertexAttributeStrings);
|
||
|
#if R42_SHADER_SET_HOVER && R42_SHADER_SET_POS_DIM
|
||
|
char *Version = R"(
|
||
|
#version 100
|
||
|
#version 100
|
||
|
#version 100
|
||
|
#version 100
|
||
|
#version 100
|
||
|
#define R42_SHADER_SET_POS_DIM 1
|
||
|
#define R42_SHADER_SET_HOVER 1
|
||
|
)";
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
internal void
|
||
|
CompileZBiasProgram(zbias_program *Result, b32x DepthPeel)
|
||
|
{
|
||
|
char Defines[1024];
|
||
|
FormatString(sizeof(Defines), Defines,
|
||
|
"#version 130\n"
|
||
|
"#define ShaderSimTexWriteSRGB %d\n"
|
||
|
"#define ShaderSimTexReadSRGB %d\n"
|
||
|
"#define DepthPeel %d\n",
|
||
|
OpenGL.ShaderSimTexWriteSRGB,
|
||
|
OpenGL.ShaderSimTexReadSRGB,
|
||
|
DepthPeel);
|
||
|
|
||
|
char *VertexCode = R"FOO(
|
||
|
// Vertex code
|
||
|
uniform m4x4 Transform;
|
||
|
|
||
|
uniform v3 CameraP;
|
||
|
uniform v3 FogDirection;
|
||
|
|
||
|
in v4 VertP;
|
||
|
in v3 VertN;
|
||
|
in v2 VertUV;
|
||
|
in v4 VertColor;
|
||
|
smooth out v2 FragUV;
|
||
|
smooth out v4 FragColor;
|
||
|
smooth out f32 FogDistance;
|
||
|
smooth out v3 WorldP;
|
||
|
smooth out v3 WorldN;
|
||
|
void main(void)
|
||
|
{
|
||
|
v4 InVertex = V4(VertP.xyz, 1.0);
|
||
|
f32 ZBias = VertP.w;
|
||
|
|
||
|
v4 ZVertex = InVertex;
|
||
|
ZVertex.z += ZBias;
|
||
|
|
||
|
v4 ZMinTransform = Transform*InVertex;
|
||
|
v4 ZMaxTransform = Transform*ZVertex;
|
||
|
|
||
|
f32 ModifiedZ = (ZMinTransform.w / ZMaxTransform.w)*ZMaxTransform.z;
|
||
|
|
||
|
gl_Position = vec4(ZMinTransform.x, ZMinTransform.y, ModifiedZ, ZMinTransform.w);
|
||
|
|
||
|
FragUV = VertUV.xy;
|
||
|
FragColor = VertColor;
|
||
|
|
||
|
FogDistance = Inner(ZVertex.xyz - CameraP, FogDirection);
|
||
|
WorldP = ZVertex.xyz;
|
||
|
WorldN = VertN;
|
||
|
}
|
||
|
)FOO";
|
||
|
|
||
|
char *Fragment = R"FOO(
|
||
|
// Fragment code
|
||
|
//uniform v4 FogColor;
|
||
|
uniform sampler2D TextureSampler;
|
||
|
#if DepthPeel
|
||
|
uniform sampler2D DepthSampler;
|
||
|
#endif
|
||
|
uniform v3 FogColor;
|
||
|
uniform f32 AlphaThreshold;
|
||
|
uniform f32 FogStartDistance;
|
||
|
uniform f32 FogEndDistance;
|
||
|
uniform f32 ClipAlphaStartDistance;
|
||
|
uniform f32 ClipAlphaEndDistance;
|
||
|
uniform v3 CameraP;
|
||
|
uniform v3 LightP;
|
||
|
|
||
|
smooth in vec2 FragUV;
|
||
|
smooth in vec4 FragColor;
|
||
|
smooth in f32 FogDistance;
|
||
|
smooth in vec3 WorldP;
|
||
|
smooth in vec3 WorldN;
|
||
|
|
||
|
layout(location = 0) out v4 BlendUnitColor[3];
|
||
|
|
||
|
void main(void)
|
||
|
{
|
||
|
#if DepthPeel
|
||
|
f32 ClipDepth = texelFetch(DepthSampler, ivec2(gl_FragCoord.xy), 0).r;
|
||
|
if(gl_FragCoord.z <= ClipDepth)
|
||
|
{
|
||
|
discard;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
vec4 TexSample = texture(TextureSampler, FragUV);
|
||
|
#if ShaderSimTexReadSRGB
|
||
|
TexSample.rgb *= TexSample.rgb;
|
||
|
#endif
|
||
|
|
||
|
f32 FogAmount = Clamp01MapToRange(FogStartDistance, FogDistance, FogEndDistance);
|
||
|
f32 AlphaAmount = Clamp01MapToRange(ClipAlphaStartDistance, FogDistance, ClipAlphaEndDistance);
|
||
|
v4 ModColor = AlphaAmount*FragColor*TexSample;
|
||
|
|
||
|
if(ModColor.a > AlphaThreshold)
|
||
|
{
|
||
|
v4 SurfaceReflect;
|
||
|
SurfaceReflect.rgb = Lerp(ModColor.rgb, FogAmount, FogColor.rgb);
|
||
|
SurfaceReflect.a = ModColor.a;
|
||
|
|
||
|
#if ShaderSimTexWriteSRGB
|
||
|
SurfaceReflect.rgb = sqrt(SurfaceReflect.rgb);
|
||
|
#endif
|
||
|
|
||
|
// TODO(casey): Some way of specifying light params
|
||
|
f32 Lp0 = 0;
|
||
|
f32 Lp1 = 0;
|
||
|
f32 EmitSpread = 1.0f;
|
||
|
v3 Emit = V3(0, 0, 0);
|
||
|
if(length(LightP - WorldP) < 2.0f)
|
||
|
{
|
||
|
Emit = V3(1, 1, 1);
|
||
|
}
|
||
|
|
||
|
v2 N2 = PackNormal2(WorldN.xy);
|
||
|
|
||
|
BlendUnitColor[0] = SurfaceReflect;
|
||
|
BlendUnitColor[1] = V4(Emit.r, Emit.g, Emit.b, EmitSpread);
|
||
|
BlendUnitColor[2] = V4(N2.x, N2.y, Lp0, Lp1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
discard;
|
||
|
}
|
||
|
}
|
||
|
)FOO";
|
||
|
|
||
|
GLuint Prog = OpenGLCreateProgram(Defines, GlobalShaderHeaderCode, VertexCode, FragmentCode, &Result->Common);
|
||
|
OpenGLLinkSamplers(&Result->Common, "TextureSampler", "DepthSampler");
|
||
|
|
||
|
Result->TransformID = glGetUniformLocation(Prog, "Transform");
|
||
|
Result->CameraP = glGetUniformLocation(Prog, "CameraP");
|
||
|
Result->FogDirection = glGetUniformLocation(Prog, "FogDirection");
|
||
|
Result->FogColor = glGetUniformLocation(Prog, "FogColor");
|
||
|
Result->FogStartDistance = glGetUniformLocation(Prog, "FogStartDistance");
|
||
|
Result->FogEndDistance = glGetUniformLocation(Prog, "FogEndDistance");
|
||
|
Result->ClipAlphaStartDistance = glGetUniformLocation(Prog, "ClipAlphaStartDistance");
|
||
|
Result->ClipAlphaEndDistance = glGetUniformLocation(Prog, "ClipAlphaEndDistance");
|
||
|
Result->AlphaThreshold = glGetUniformLocation(Prog, "AlphaThreshold");
|
||
|
|
||
|
Result->DebugLightP = glGetUniformLocation(Prog, "LightP");
|
||
|
}
|
||
|
|
||
|
|