Deferred shading for rigged attachments.
parent
6e7bd47bea
commit
bf8bcfe4f7
|
|
@ -53,8 +53,9 @@
|
|||
static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
|
||||
static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
|
||||
static U32 sShaderLevel = 0;
|
||||
static LLGLSLShader* sVertexProgram = NULL;
|
||||
|
||||
|
||||
LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
|
||||
BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
|
||||
BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
|
||||
|
||||
|
|
@ -176,6 +177,9 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
|
|||
case 2:
|
||||
beginDeferredSkinned();
|
||||
break;
|
||||
case 3:
|
||||
beginDeferredRigged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -202,6 +206,8 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
|
|||
case 2:
|
||||
endDeferredSkinned();
|
||||
break;
|
||||
case 3:
|
||||
endDeferredRigged();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -248,41 +254,58 @@ void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
|
|||
|
||||
S32 LLDrawPoolAvatar::getNumShadowPasses()
|
||||
{
|
||||
return 1;
|
||||
return 2;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginShadowPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_SHADOW_AVATAR);
|
||||
sVertexProgram = &gDeferredAvatarShadowProgram;
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
|
||||
|
||||
glColor4f(1,1,1,1);
|
||||
|
||||
if ((sShaderLevel > 0)) // for hardware blending
|
||||
if (pass == 0)
|
||||
{
|
||||
sRenderingSkinned = TRUE;
|
||||
sVertexProgram = &gDeferredAvatarShadowProgram;
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
|
||||
|
||||
glColor4f(1,1,1,1);
|
||||
|
||||
if ((sShaderLevel > 0)) // for hardware blending
|
||||
{
|
||||
sRenderingSkinned = TRUE;
|
||||
sVertexProgram->bind();
|
||||
enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gDeferredAttachmentShadowProgram;
|
||||
sVertexProgram->bind();
|
||||
enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endShadowPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_SHADOW_AVATAR);
|
||||
if (sShaderLevel > 0)
|
||||
if (pass == 0)
|
||||
{
|
||||
sRenderingSkinned = FALSE;
|
||||
sVertexProgram->unbind();
|
||||
disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
sRenderingSkinned = FALSE;
|
||||
sVertexProgram->unbind();
|
||||
disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
sVertexProgram->unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderShadow(S32 pass)
|
||||
|
|
@ -312,13 +335,19 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
|
|||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0)
|
||||
if (pass == 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
|
||||
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
|
||||
}
|
||||
else
|
||||
{
|
||||
avatarp->renderSkinnedAttachments();
|
||||
}
|
||||
|
||||
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
|
||||
|
||||
}
|
||||
|
||||
S32 LLDrawPoolAvatar::getNumPasses()
|
||||
|
|
@ -578,7 +607,7 @@ void LLDrawPoolAvatar::endSkinned()
|
|||
|
||||
void LLDrawPoolAvatar::beginRigged()
|
||||
{
|
||||
sVertexProgram = NULL;
|
||||
sVertexProgram = &gSkinnedObjectSimpleProgram;
|
||||
gSkinnedObjectSimpleProgram.bind();
|
||||
LLVertexBuffer::sWeight4Loc = gSkinnedObjectSimpleProgram.getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
|
@ -591,6 +620,21 @@ void LLDrawPoolAvatar::endRigged()
|
|||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginDeferredRigged()
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedDiffuseProgram;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endDeferredRigged()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
sVertexProgram->unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginDeferredSkinned()
|
||||
{
|
||||
sShaderLevel = mVertexShaderLevel;
|
||||
|
|
@ -893,16 +937,16 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
|
|||
glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));
|
||||
glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
|
||||
|
||||
set_vertex_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
|
||||
set_vertex_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
|
||||
|
||||
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
|
||||
{
|
||||
set_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
|
||||
set_binormals(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
|
||||
}
|
||||
|
||||
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
|
||||
{
|
||||
set_vertex_clothing_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
|
||||
set_vertex_clothing_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include "lldrawpool.h"
|
||||
|
||||
class LLVOAvatar;
|
||||
class LLGLSLShader;
|
||||
|
||||
class LLDrawPoolAvatar : public LLFacePool
|
||||
{
|
||||
|
|
@ -100,10 +101,12 @@ public:
|
|||
void beginDeferredImpostor();
|
||||
void beginDeferredRigid();
|
||||
void beginDeferredSkinned();
|
||||
void beginDeferredRigged();
|
||||
|
||||
void endDeferredImpostor();
|
||||
void endDeferredRigid();
|
||||
void endDeferredSkinned();
|
||||
void endDeferredRigged();
|
||||
|
||||
/*virtual*/ LLViewerTexture *getDebugTexture();
|
||||
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
|
||||
|
|
@ -112,6 +115,7 @@ public:
|
|||
|
||||
static BOOL sSkipOpaque;
|
||||
static BOOL sSkipTransparent;
|
||||
static LLGLSLShader* sVertexProgram;
|
||||
};
|
||||
|
||||
class LLVertexBufferAvatar : public LLVertexBuffer
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ LLGLSLShader gDeferredImpostorProgram;
|
|||
LLGLSLShader gDeferredEdgeProgram;
|
||||
LLGLSLShader gDeferredWaterProgram;
|
||||
LLGLSLShader gDeferredDiffuseProgram;
|
||||
LLGLSLShader gDeferredSkinnedDiffuseProgram;
|
||||
LLGLSLShader gDeferredBumpProgram;
|
||||
LLGLSLShader gDeferredTerrainProgram;
|
||||
LLGLSLShader gDeferredTreeProgram;
|
||||
|
|
@ -124,6 +125,7 @@ LLGLSLShader gDeferredBlurLightProgram;
|
|||
LLGLSLShader gDeferredSoftenProgram;
|
||||
LLGLSLShader gDeferredShadowProgram;
|
||||
LLGLSLShader gDeferredAvatarShadowProgram;
|
||||
LLGLSLShader gDeferredAttachmentShadowProgram;
|
||||
LLGLSLShader gDeferredAlphaProgram;
|
||||
LLGLSLShader gDeferredFullbrightProgram;
|
||||
LLGLSLShader gDeferredGIProgram;
|
||||
|
|
@ -575,6 +577,7 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
gPostNightVisionProgram.unload();
|
||||
|
||||
gDeferredDiffuseProgram.unload();
|
||||
gDeferredSkinnedDiffuseProgram.unload();
|
||||
|
||||
mVertexShaderLevel[SHADER_LIGHTING] = 0;
|
||||
mVertexShaderLevel[SHADER_OBJECT] = 0;
|
||||
|
|
@ -889,6 +892,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
{
|
||||
gDeferredTreeProgram.unload();
|
||||
gDeferredDiffuseProgram.unload();
|
||||
gDeferredSkinnedDiffuseProgram.unload();
|
||||
gDeferredBumpProgram.unload();
|
||||
gDeferredImpostorProgram.unload();
|
||||
gDeferredTerrainProgram.unload();
|
||||
|
|
@ -901,6 +905,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSoftenProgram.unload();
|
||||
gDeferredShadowProgram.unload();
|
||||
gDeferredAvatarShadowProgram.unload();
|
||||
gDeferredAttachmentShadowProgram.unload();
|
||||
gDeferredAvatarProgram.unload();
|
||||
gDeferredAvatarAlphaProgram.unload();
|
||||
gDeferredAlphaProgram.unload();
|
||||
|
|
@ -929,6 +934,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gDeferredDiffuseProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredSkinnedDiffuseProgram.mName = "Deferred Skinned Diffuse Shader";
|
||||
gDeferredSkinnedDiffuseProgram.mFeatures.hasObjectSkinning = true;
|
||||
gDeferredSkinnedDiffuseProgram.mShaderFiles.clear();
|
||||
gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredSkinnedDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredSkinnedDiffuseProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredSkinnedDiffuseProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredBumpProgram.mName = "Deferred Bump Shader";
|
||||
|
|
@ -1104,6 +1120,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gDeferredAvatarShadowProgram.createShader(&mAvatarAttribs, &mAvatarUniforms);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredAttachmentShadowProgram.mName = "Deferred Attachment Shadow Shader";
|
||||
gDeferredAttachmentShadowProgram.mFeatures.hasObjectSkinning = true;
|
||||
gDeferredAttachmentShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredAttachmentShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTerrainProgram.mName = "Deferred Terrain Shader";
|
||||
|
|
|
|||
|
|
@ -346,6 +346,7 @@ extern LLGLSLShader gDeferredImpostorProgram;
|
|||
extern LLGLSLShader gDeferredEdgeProgram;
|
||||
extern LLGLSLShader gDeferredWaterProgram;
|
||||
extern LLGLSLShader gDeferredDiffuseProgram;
|
||||
extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
|
||||
extern LLGLSLShader gDeferredBumpProgram;
|
||||
extern LLGLSLShader gDeferredTerrainProgram;
|
||||
extern LLGLSLShader gDeferredTreeProgram;
|
||||
|
|
@ -363,6 +364,7 @@ extern LLGLSLShader gDeferredShadowProgram;
|
|||
extern LLGLSLShader gDeferredPostGIProgram;
|
||||
extern LLGLSLShader gDeferredPostProgram;
|
||||
extern LLGLSLShader gDeferredAvatarShadowProgram;
|
||||
extern LLGLSLShader gDeferredAttachmentShadowProgram;
|
||||
extern LLGLSLShader gDeferredAlphaProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightProgram;
|
||||
extern LLGLSLShader gDeferredAvatarAlphaProgram;
|
||||
|
|
|
|||
|
|
@ -3742,11 +3742,11 @@ U32 LLVOAvatar::renderSkinnedAttachments()
|
|||
}
|
||||
}
|
||||
|
||||
gSkinnedObjectSimpleProgram.uniformMatrix4fv("matrixPalette",
|
||||
LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette",
|
||||
skin->mJointNames.size(),
|
||||
FALSE,
|
||||
(GLfloat*) mat[0].mMatrix);
|
||||
gSkinnedObjectSimpleProgram.uniformMatrix4fv("matrixPalette[0]",
|
||||
LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette[0]",
|
||||
skin->mJointNames.size(),
|
||||
FALSE,
|
||||
(GLfloat*) mat[0].mMatrix);
|
||||
|
|
|
|||
Loading…
Reference in New Issue