fixed GL2 portal clip plane not being used

This commit is contained in:
myT 2023-05-30 19:51:06 +02:00
parent 815b8d0c02
commit 5b591f270d
2 changed files with 78 additions and 4 deletions

View file

@ -100,6 +100,9 @@ chg: with r_backend GL3, depth fade with MSAA now requires GLSL 4.00 at a minimu
chg: with r_backend GL3, alpha to coverage now requires GLSL 4.00 at a minimum
fix: with r_backend GL2, the extra clip plane for mirror/portal surfaces was not being used
this quick fix is likely to fail for some drivers and vendors due to its use of deprecated features
fix: long demo file names would cause video recording to output files with no extension or outright fail
fix: invalid skybox texture mip-mapping and filtering settings (e.g. cpm25 skybox seams)

View file

@ -96,7 +96,55 @@ static const char* sharedFS =
"}\n"
"\n";
static const char* genericVS =
static const char* genericVS_v0 =
"void main()\n"
"{\n"
" vec4 positionVS = gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1);\n"
" gl_ClipDistance[0] = dot(positionVS, gl_ClipPlane[0]);\n"
" gl_Position = ftransform();\n"
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
" gl_TexCoord[1] = gl_MultiTexCoord1;\n"
" gl_TexCoord[2] = gl_Color;\n"
"}\n";
// gl_ClipDistance doesn't have to be redeclared according to the GLSL specs,
// but there might some finicky drivers out there
static const char* genericVS_v1 =
"out varying float gl_ClipDistance[1];\n"
"\n"
"void main()\n"
"{\n"
" vec4 positionVS = gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1);\n"
" gl_ClipDistance[0] = dot(positionVS, gl_ClipPlane[0]);\n"
" gl_Position = ftransform();\n"
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
" gl_TexCoord[1] = gl_MultiTexCoord1;\n"
" gl_TexCoord[2] = gl_Color;\n"
"}\n";
// gl_ClipDistance doesn't have to be redeclared according to the GLSL specs,
// but there might some finicky drivers out there
static const char* genericVS_v2 =
"#extension GL_ARB_gpu_shader5 : require\n"
"\n"
"out gl_PerVertex\n"
"{\n"
" vec4 gl_Position;\n"
" vec4 gl_TexCoord[3];\n"
" float gl_ClipDistance[1];\n"
"};\n"
"\n"
"void main()\n"
"{\n"
" vec4 positionVS = gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1);\n"
" gl_ClipDistance[0] = dot(positionVS, gl_ClipPlane[0]);\n"
" gl_Position = ftransform();\n"
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
" gl_TexCoord[1] = gl_MultiTexCoord1;\n"
" gl_TexCoord[2] = gl_Color;\n"
"}\n";
static const char* genericVS_v3 =
"void main()\n"
"{\n"
" gl_Position = ftransform();\n"
@ -105,6 +153,14 @@ static const char* genericVS =
" gl_TexCoord[2] = gl_Color;\n"
"}\n";
static const char* genericVS[] =
{
genericVS_v0,
genericVS_v1,
genericVS_v2,
genericVS_v3
};
static const char* genericFS =
"uniform sampler2D texture1;\n"
"uniform sampler2D texture2;\n"
@ -815,10 +871,21 @@ static qbool GL2_Init()
return qfalse;
}
if ( !GL2_CreateProgram( genericProg, genericVS, genericFS ) ) {
ri.Error( PRINT_ERROR, "Failed to compile generic shaders\n" );
qbool createdGenericVS = qfalse;
for ( int i = 0; i < ARRAY_LEN( genericVS ); ++i ) {
if ( GL2_CreateProgram( genericProg, genericVS[i], genericFS ) ) {
createdGenericVS = qtrue;
if ( i == ARRAY_LEN( genericVS ) - 1 ) {
ri.Printf( PRINT_WARNING, "Failed to compile generic shader using gl_ClipDistance\n" );
}
break;
}
}
if ( !createdGenericVS ) {
ri.Error( PRINT_ERROR, "Failed to compile all variants of the generic shaders\n" );
return qfalse;
}
genericProgAttribs.texture1 = glGetUniformLocation( genericProg.p, "texture1" );
genericProgAttribs.texture2 = glGetUniformLocation( genericProg.p, "texture2" );
genericProgAttribs.texEnv = glGetUniformLocation( genericProg.p, "texEnv" );
@ -1305,10 +1372,14 @@ static void GAL_Begin3D()
plane2[2] = DotProduct (backEnd.viewParms.orient.axis[2], plane);
plane2[3] = DotProduct (plane, backEnd.viewParms.orient.origin) - plane[3];
glLoadMatrixf( s_flipMatrix );
glLoadMatrixf (s_flipMatrix);
glClipPlane (GL_CLIP_PLANE0, plane2);
glEnable (GL_CLIP_PLANE0);
} else {
const double dummyPlane[4] = { 0, 0, 0, 0 };
glLoadIdentity();
glClipPlane (GL_CLIP_PLANE0, dummyPlane);
glDisable (GL_CLIP_PLANE0);
}
}