OpenGL2: Calculate bitangent in shader, and store normal/tangent as normalized byte arrays.
This commit is contained in:
parent
a53e7c3074
commit
6e5f8cc918
15 changed files with 268 additions and 271 deletions
|
@ -124,10 +124,25 @@ void RB_AddQuadStampExt( vec3_t origin, vec3_t left, vec3_t up, float color[4],
|
|||
// constant normal all the way around
|
||||
VectorSubtract( vec3_origin, backEnd.viewParms.or.axis[0], normal );
|
||||
|
||||
VectorCopy(normal, tess.normal[ndx]);
|
||||
VectorCopy(normal, tess.normal[ndx+1]);
|
||||
VectorCopy(normal, tess.normal[ndx+2]);
|
||||
VectorCopy(normal, tess.normal[ndx+3]);
|
||||
tess.normal[ndx][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx][3] = 0;
|
||||
|
||||
tess.normal[ndx+1][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+1][3] = 0;
|
||||
|
||||
tess.normal[ndx+2][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+2][3] = 0;
|
||||
|
||||
tess.normal[ndx+3][0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
tess.normal[ndx+3][3] = 0;
|
||||
|
||||
// standard square texture coordinates
|
||||
VectorSet2(tess.texCoords[ndx ][0], s1, t1);
|
||||
|
@ -316,9 +331,10 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
int i;
|
||||
glIndex_t *inIndex;
|
||||
srfVert_t *dv;
|
||||
float *xyz, *normal, *texCoords, *lightCoords, *lightdir;
|
||||
float *xyz, *texCoords, *lightCoords, *lightdir;
|
||||
uint8_t *normal;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
float *tangent, *bitangent;
|
||||
uint8_t *tangent;
|
||||
#endif
|
||||
glIndex_t *outIndex;
|
||||
float *color;
|
||||
|
@ -347,7 +363,12 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
dv = verts;
|
||||
normal = tess.normal[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, normal+=4 )
|
||||
VectorCopy(dv->normal, normal);
|
||||
{
|
||||
normal[0] = (uint8_t)(dv->normal[0] * 127.5f + 128.0f);
|
||||
normal[1] = (uint8_t)(dv->normal[1] * 127.5f + 128.0f);
|
||||
normal[2] = (uint8_t)(dv->normal[2] * 127.5f + 128.0f);
|
||||
normal[3] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
|
@ -356,15 +377,12 @@ static void RB_SurfaceVertsAndIndexes( int numVerts, srfVert_t *verts, int numIn
|
|||
dv = verts;
|
||||
tangent = tess.tangent[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, tangent+=4 )
|
||||
VectorCopy(dv->tangent, tangent);
|
||||
}
|
||||
|
||||
if ( tess.shader->vertexAttribs & ATTR_BITANGENT )
|
||||
{
|
||||
dv = verts;
|
||||
bitangent = tess.bitangent[ tess.numVertexes ];
|
||||
for ( i = 0 ; i < numVerts ; i++, dv++, bitangent+=4 )
|
||||
VectorCopy(dv->bitangent, bitangent);
|
||||
{
|
||||
tangent[0] = (uint8_t)(dv->tangent[0] * 127.5f + 128.0f);
|
||||
tangent[1] = (uint8_t)(dv->tangent[1] * 127.5f + 128.0f);
|
||||
tangent[2] = (uint8_t)(dv->tangent[2] * 127.5f + 128.0f);
|
||||
tangent[3] = (uint8_t)(dv->tangent[3] * 127.5f + 128.0f);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1127,7 +1145,8 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
VectorArrayNormalize((vec4_t *)tess.normal[tess.numVertexes], numVerts);
|
||||
}
|
||||
#endif
|
||||
float *outXyz, *outNormal;
|
||||
float *outXyz;
|
||||
uint8_t *outNormal;
|
||||
mdvVertex_t *newVerts;
|
||||
int vertNum;
|
||||
|
||||
|
@ -1144,8 +1163,16 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
|
||||
for (vertNum=0 ; vertNum < surf->numVerts ; vertNum++)
|
||||
{
|
||||
vec3_t normal;
|
||||
|
||||
VectorCopy(newVerts->xyz, outXyz);
|
||||
VectorCopy(newVerts->normal, outNormal);
|
||||
VectorCopy(newVerts->normal, normal);
|
||||
|
||||
outNormal[0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
outNormal[1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
outNormal[2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
outNormal[3] = 0;
|
||||
|
||||
newVerts++;
|
||||
outXyz += 4;
|
||||
outNormal += 4;
|
||||
|
@ -1163,15 +1190,22 @@ static void LerpMeshVertexes_scalar(mdvSurface_t *surf, float backlerp)
|
|||
|
||||
for (vertNum=0 ; vertNum < surf->numVerts ; vertNum++)
|
||||
{
|
||||
vec3_t normal;
|
||||
|
||||
VectorLerp(newVerts->xyz, oldVerts->xyz, backlerp, outXyz);
|
||||
VectorLerp(newVerts->normal, oldVerts->normal, backlerp, outNormal);
|
||||
//VectorNormalize(outNormal);
|
||||
VectorLerp(newVerts->normal, oldVerts->normal, backlerp, normal);
|
||||
VectorNormalize(normal);
|
||||
|
||||
outNormal[0] = (uint8_t)(normal[0] * 127.5f + 128.0f);
|
||||
outNormal[1] = (uint8_t)(normal[1] * 127.5f + 128.0f);
|
||||
outNormal[2] = (uint8_t)(normal[2] * 127.5f + 128.0f);
|
||||
outNormal[3] = 0;
|
||||
|
||||
newVerts++;
|
||||
oldVerts++;
|
||||
outXyz += 4;
|
||||
outNormal += 4;
|
||||
}
|
||||
VectorArrayNormalize((vec4_t *)tess.normal[tess.numVertexes], surf->numVerts);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1292,9 +1326,9 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
int i, j;
|
||||
float *xyz;
|
||||
float *texCoords, *lightCoords;
|
||||
float *normal;
|
||||
uint8_t *normal;
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
float *tangent, *bitangent;
|
||||
uint8_t *tangent;
|
||||
#endif
|
||||
float *color, *lightdir;
|
||||
srfVert_t *dv;
|
||||
|
@ -1382,7 +1416,6 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
normal = tess.normal[numVertexes];
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
tangent = tess.tangent[numVertexes];
|
||||
bitangent = tess.bitangent[numVertexes];
|
||||
#endif
|
||||
texCoords = tess.texCoords[numVertexes][0];
|
||||
lightCoords = tess.texCoords[numVertexes][1];
|
||||
|
@ -1403,22 +1436,22 @@ static void RB_SurfaceGrid( srfBspSurface_t *srf ) {
|
|||
|
||||
if ( tess.shader->vertexAttribs & ATTR_NORMAL )
|
||||
{
|
||||
VectorCopy(dv->normal, normal);
|
||||
normal[0] = (uint8_t)(dv->normal[0] * 127.5f + 128.0f);
|
||||
normal[1] = (uint8_t)(dv->normal[1] * 127.5f + 128.0f);
|
||||
normal[2] = (uint8_t)(dv->normal[2] * 127.5f + 128.0f);
|
||||
normal[3] = 0;
|
||||
normal += 4;
|
||||
}
|
||||
|
||||
#ifdef USE_VERT_TANGENT_SPACE
|
||||
if ( tess.shader->vertexAttribs & ATTR_TANGENT )
|
||||
{
|
||||
VectorCopy(dv->tangent, tangent);
|
||||
tangent[0] = (uint8_t)(dv->tangent[0] * 127.5f + 128.0f);
|
||||
tangent[1] = (uint8_t)(dv->tangent[1] * 127.5f + 128.0f);
|
||||
tangent[2] = (uint8_t)(dv->tangent[2] * 127.5f + 128.0f);
|
||||
tangent[3] = (uint8_t)(dv->tangent[3] * 127.5f + 128.0f);
|
||||
tangent += 4;
|
||||
}
|
||||
|
||||
if ( tess.shader->vertexAttribs & ATTR_BITANGENT )
|
||||
{
|
||||
VectorCopy(dv->bitangent, bitangent);
|
||||
bitangent += 4;
|
||||
}
|
||||
#endif
|
||||
if ( tess.shader->vertexAttribs & ATTR_TEXCOORD )
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue