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:
parent
cccd283be8
commit
11337c9fa2
10 changed files with 533 additions and 34 deletions
|
@ -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 );
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue