OpenGL2: Add GPU vertex skinning for IQM models

Using GPU vertex skinning is significantly faster than CPU vertex
skinning. Especially since OpenGL2 has to run R_VaoPackNormal() and
R_VaoPackTangent() each vertex each frame which causes CPU vertex
skinning to be significantly slower than OpenGL1 renderer.
This commit is contained in:
Zack Middleton 2018-07-27 17:40:25 -05:00
parent cccd283be8
commit 11337c9fa2
10 changed files with 533 additions and 34 deletions

View file

@ -554,16 +554,18 @@ enum
GENERICDEF_USE_VERTEX_ANIMATION = 0x0004,
GENERICDEF_USE_FOG = 0x0008,
GENERICDEF_USE_RGBAGEN = 0x0010,
GENERICDEF_ALL = 0x001F,
GENERICDEF_COUNT = 0x0020,
GENERICDEF_USE_BONE_ANIMATION = 0x0020,
GENERICDEF_ALL = 0x003F,
GENERICDEF_COUNT = 0x0040,
};
enum
{
FOGDEF_USE_DEFORM_VERTEXES = 0x0001,
FOGDEF_USE_VERTEX_ANIMATION = 0x0002,
FOGDEF_ALL = 0x0003,
FOGDEF_COUNT = 0x0004,
FOGDEF_USE_BONE_ANIMATION = 0x0004,
FOGDEF_ALL = 0x0007,
FOGDEF_COUNT = 0x0008,
};
enum
@ -579,12 +581,21 @@ enum
LIGHTDEF_USE_LIGHT_VECTOR = 0x0002,
LIGHTDEF_USE_LIGHT_VERTEX = 0x0003,
LIGHTDEF_LIGHTTYPE_MASK = 0x0003,
LIGHTDEF_ENTITY = 0x0004,
LIGHTDEF_ENTITY_VERTEX_ANIMATION = 0x0004,
LIGHTDEF_USE_TCGEN_AND_TCMOD = 0x0008,
LIGHTDEF_USE_PARALLAXMAP = 0x0010,
LIGHTDEF_USE_SHADOWMAP = 0x0020,
LIGHTDEF_ALL = 0x003F,
LIGHTDEF_COUNT = 0x0040
LIGHTDEF_ENTITY_BONE_ANIMATION = 0x0040,
LIGHTDEF_ALL = 0x007F,
LIGHTDEF_COUNT = 0x0080
};
enum
{
SHADOWMAPDEF_USE_VERTEX_ANIMATION = 0x0001,
SHADOWMAPDEF_USE_BONE_ANIMATION = 0x0002,
SHADOWMAPDEF_ALL = 0x0003,
SHADOWMAPDEF_COUNT = 0x0004
};
enum
@ -595,7 +606,8 @@ enum
GLSL_VEC2,
GLSL_VEC3,
GLSL_VEC4,
GLSL_MAT16
GLSL_MAT16,
GLSL_MAT16_BONEMATRIX
};
typedef enum
@ -686,6 +698,8 @@ typedef enum
UNIFORM_ALPHATEST,
UNIFORM_BONEMATRIX,
UNIFORM_COUNT
} uniform_t;
@ -849,6 +863,7 @@ typedef enum {
SF_FLARE,
SF_ENTITY, // beams, rails, lightning, etc that can be determined by entity
SF_VAO_MDVMESH,
SF_VAO_IQM,
SF_NUM_SURFACE_TYPES,
SF_MAX = 0x7fffffff // ensures that sizeof( surfaceType_t ) == sizeof( int )
@ -976,6 +991,9 @@ typedef struct {
float *jointMats;
float *poseMats;
float *bounds;
int numVaoSurfaces;
struct srfVaoIQModel_s *vaoSurfaces;
} iqmData_t;
// inter-quake-model surface
@ -989,6 +1007,21 @@ typedef struct srfIQModel_s {
int first_influence, num_influences;
} srfIQModel_t;
typedef struct srfVaoIQModel_s
{
surfaceType_t surfaceType;
iqmData_t *iqmData;
struct srfIQModel_s *iqmSurface;
// backEnd stats
int numIndexes;
int numVerts;
// static render data
vao_t *vao;
} srfVaoIQModel_t;
typedef struct srfVaoMdvMesh_s
{
surfaceType_t surfaceType;
@ -1332,6 +1365,8 @@ typedef struct {
uint32_t storedGlState;
float vertexAttribsInterpolation;
qboolean vertexAnimation;
int boneAnimation; // number of bones
mat4_t boneMatrix[IQM_MAX_JOINTS];
uint32_t vertexAttribsEnabled; // global if no VAOs, tess only otherwise
FBO_t *currentFBO;
vao_t *currentVao;
@ -1361,6 +1396,7 @@ typedef struct {
int glslMajorVersion;
int glslMinorVersion;
int glslMaxAnimatedBones;
memInfo_t memInfo;
@ -1541,7 +1577,7 @@ typedef struct {
shaderProgram_t fogShader[FOGDEF_COUNT];
shaderProgram_t dlightShader[DLIGHTDEF_COUNT];
shaderProgram_t lightallShader[LIGHTDEF_COUNT];
shaderProgram_t shadowmapShader;
shaderProgram_t shadowmapShader[SHADOWMAPDEF_COUNT];
shaderProgram_t pshadowShader;
shaderProgram_t down4xShader;
shaderProgram_t bokehShader;
@ -2190,6 +2226,7 @@ void GLSL_SetUniformVec2(shaderProgram_t *program, int uniformNum, const vec2_t
void GLSL_SetUniformVec3(shaderProgram_t *program, int uniformNum, const vec3_t v);
void GLSL_SetUniformVec4(shaderProgram_t *program, int uniformNum, const vec4_t v);
void GLSL_SetUniformMat4(shaderProgram_t *program, int uniformNum, const mat4_t matrix);
void GLSL_SetUniformMat4BoneMatrix(shaderProgram_t *program, int uniformNum, /*const*/ mat4_t *matrix, int numMatricies);
shaderProgram_t *GLSL_GetGenericShaderProgram(int stage);
@ -2244,6 +2281,7 @@ void RB_MDRSurfaceAnim( mdrSurface_t *surface );
qboolean R_LoadIQM (model_t *mod, void *buffer, int filesize, const char *name );
void R_AddIQMSurfaces( trRefEntity_t *ent );
void RB_IQMSurfaceAnim( surfaceType_t *surface );
void RB_IQMSurfaceAnimVao( srfVaoIQModel_t *surface );
int R_IQMLerpTag( orientation_t *tag, iqmData_t *data,
int startFrame, int endFrame,
float frac, const char *tagName );