mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 13:01:47 +00:00
- use default fragment shader for burn and stencil shader, with the time consuming parts disabled by a #define, to avoid code duplication.
This commit is contained in:
parent
92185f96eb
commit
a936629cec
4 changed files with 38 additions and 29 deletions
|
@ -212,6 +212,27 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
|
||||||
int texture_index = glGetUniformLocation(hShader, "texture2");
|
int texture_index = glGetUniformLocation(hShader, "texture2");
|
||||||
if (texture_index > 0) glUniform1i(texture_index, 1);
|
if (texture_index > 0) glUniform1i(texture_index, 1);
|
||||||
|
|
||||||
|
|
||||||
|
GLint binaryLength;
|
||||||
|
void* binary;
|
||||||
|
FILE* outfile;
|
||||||
|
GLenum binaryFormat;
|
||||||
|
//
|
||||||
|
// Retrieve the binary from the program object
|
||||||
|
//
|
||||||
|
glGetProgramiv(hShader, GL_PROGRAM_BINARY_LENGTH, &binaryLength);
|
||||||
|
binary = (void*)malloc(binaryLength);
|
||||||
|
glGetProgramBinary(hShader, binaryLength, NULL, &binaryFormat, binary);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Cache the program binary for future runs
|
||||||
|
//
|
||||||
|
outfile = fopen(name, "wb");
|
||||||
|
fwrite(binary, binaryLength, 1, outfile);
|
||||||
|
fclose(outfile);
|
||||||
|
free(binary);
|
||||||
|
|
||||||
|
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
return !!linked;
|
return !!linked;
|
||||||
}
|
}
|
||||||
|
@ -316,8 +337,8 @@ static const FEffectShader effectshaders[]=
|
||||||
{
|
{
|
||||||
{ "fogboundary", "shaders/glsl/main.vp", "shaders/glsl/fogboundary.fp", NULL, "" },
|
{ "fogboundary", "shaders/glsl/main.vp", "shaders/glsl/fogboundary.fp", NULL, "" },
|
||||||
{ "spheremap", "shaders/glsl/main.vp", "shaders/glsl/main.fp", "shaders/glsl/func_normal.fp", "#define SPHEREMAP\n" },
|
{ "spheremap", "shaders/glsl/main.vp", "shaders/glsl/main.fp", "shaders/glsl/func_normal.fp", "#define SPHEREMAP\n" },
|
||||||
{ "burn", "shaders/glsl/burn.vp", "shaders/glsl/burn.fp", NULL, "" },
|
{ "burn", "shaders/glsl/main.vp", "shaders/glsl/burn.fp", NULL, "#define SIMPLE\n" },
|
||||||
{ "stencil", "shaders/glsl/stencil.vp", "shaders/glsl/stencil.fp", NULL, "" },
|
{ "stencil", "shaders/glsl/main.vp", "shaders/glsl/stencil.fp", NULL, "#define SIMPLE\n" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
gl_FrontColor = gl_Color;
|
|
||||||
gl_TexCoord[0] = gl_MultiTexCoord0;
|
|
||||||
gl_Position = ProjectionMatrix * gl_Vertex;
|
|
||||||
}
|
|
|
@ -1,7 +1,9 @@
|
||||||
|
|
||||||
|
#ifndef SIMPLE // we do not need these for simple shaders
|
||||||
in vec4 aVertex2;
|
in vec4 aVertex2;
|
||||||
out vec4 pixelpos;
|
out vec4 pixelpos;
|
||||||
out vec2 glowdist;
|
out vec2 glowdist;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef UNIFORM_VB
|
#ifdef UNIFORM_VB
|
||||||
uniform float fakeVB[100];
|
uniform float fakeVB[100];
|
||||||
|
@ -30,16 +32,23 @@ void main()
|
||||||
#define tc gl_MultiTexCoord0
|
#define tc gl_MultiTexCoord0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SIMPLE
|
||||||
vec4 worldcoord = ModelMatrix * mix(vert, aVertex2, uInterpolationFactor);
|
vec4 worldcoord = ModelMatrix * mix(vert, aVertex2, uInterpolationFactor);
|
||||||
|
#else
|
||||||
|
vec4 worldcoord = ModelMatrix * vert;
|
||||||
|
#endif
|
||||||
|
|
||||||
vec4 eyeCoordPos = ViewMatrix * worldcoord;
|
vec4 eyeCoordPos = ViewMatrix * worldcoord;
|
||||||
|
|
||||||
gl_FrontColor = gl_Color;
|
gl_FrontColor = gl_Color;
|
||||||
|
|
||||||
|
#ifndef SIMPLE
|
||||||
pixelpos.xyz = worldcoord.xyz;
|
pixelpos.xyz = worldcoord.xyz;
|
||||||
pixelpos.w = -eyeCoordPos.z/eyeCoordPos.w;
|
pixelpos.w = -eyeCoordPos.z/eyeCoordPos.w;
|
||||||
|
|
||||||
glowdist.x = -((uGlowTopPlane.w + uGlowTopPlane.x * worldcoord.x + uGlowTopPlane.y * worldcoord.z) * uGlowTopPlane.z) - worldcoord.y;
|
glowdist.x = -((uGlowTopPlane.w + uGlowTopPlane.x * worldcoord.x + uGlowTopPlane.y * worldcoord.z) * uGlowTopPlane.z) - worldcoord.y;
|
||||||
glowdist.y = worldcoord.y + ((uGlowBottomPlane.w + uGlowBottomPlane.x * worldcoord.x + uGlowBottomPlane.y * worldcoord.z) * uGlowBottomPlane.z);
|
glowdist.y = worldcoord.y + ((uGlowBottomPlane.w + uGlowBottomPlane.x * worldcoord.x + uGlowBottomPlane.y * worldcoord.z) * uGlowBottomPlane.z);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SPHEREMAP
|
#ifdef SPHEREMAP
|
||||||
vec3 u = normalize(eyeCoordPos.xyz);
|
vec3 u = normalize(eyeCoordPos.xyz);
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
|
|
||||||
out vec4 pixelpos;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
// perform exactly the same relevant steps as in the main shader to ensure matching results (that also means including the model matrix here!)
|
|
||||||
vec4 worldcoord = ModelMatrix * gl_Vertex;
|
|
||||||
vec4 eyeCoordPos = ViewMatrix * worldcoord;
|
|
||||||
|
|
||||||
pixelpos.xyz = worldcoord.xyz;
|
|
||||||
pixelpos.w = -eyeCoordPos.z/eyeCoordPos.w;
|
|
||||||
|
|
||||||
gl_Position = ProjectionMatrix * eyeCoordPos;
|
|
||||||
}
|
|
Loading…
Reference in a new issue