瀏覽代碼

fix particle glow

AzaezelX 2 天之前
父節點
當前提交
ab80a842aa

+ 4 - 0
Engine/source/gfx/gl/gfxGLShader.cpp

@@ -1122,15 +1122,19 @@ void GFXGLShader::setConstantsFromBuffer(U8* buffer)
          // Set sampler number on our program.
          glUniform1i(handle->mDesc.bindPoint, handle->mDesc.samplerReg);
          break;
+      case GFXSCT_Bool:
       case GFXSCT_Int:
          glUniform1iv(handle->mDesc.bindPoint, handle->mDesc.arraySize, (GLint*)(mGlobalConstBuffer + handle->mDesc.offset));
          break;
+      case GFXSCT_Bool2:
       case GFXSCT_Int2:
          glUniform2iv(handle->mDesc.bindPoint, handle->mDesc.arraySize, (GLint*)(mGlobalConstBuffer + handle->mDesc.offset));
          break;
+      case GFXSCT_Bool3:
       case GFXSCT_Int3:
          glUniform3iv(handle->mDesc.bindPoint, handle->mDesc.arraySize, (GLint*)(mGlobalConstBuffer + handle->mDesc.offset));
          break;
+      case GFXSCT_Bool4:
       case GFXSCT_Int4:
          glUniform4iv(handle->mDesc.bindPoint, handle->mDesc.arraySize, (GLint*)(mGlobalConstBuffer + handle->mDesc.offset));
          break;

+ 3 - 1
Engine/source/renderInstance/renderParticleMgr.cpp

@@ -495,7 +495,8 @@ void RenderParticleMgr::renderParticle(ParticleRenderInst* ri, SceneRenderState*
 
    mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mAlphaFactorSC, alphaFactor );
    mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mAlphaScaleSC, alphaScale );
-
+   mParticleShaderConsts.mShaderConsts->setSafe(mParticleShaderConsts.mGlowSC, ri->glow ? 1 : 0);
+   
    mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mFSModelViewProjSC, *ri->modelViewProj  );
    mParticleShaderConsts.mShaderConsts->setSafe( mParticleShaderConsts.mOneOverFarSC, 1.0f / state->getFarPlane() );     
 
@@ -556,6 +557,7 @@ bool RenderParticleMgr::_initShader()
       mParticleShaderConsts.mOneOverSoftnessSC = mParticleShader->getShaderConstHandle( "$oneOverSoftness" );
       mParticleShaderConsts.mAlphaFactorSC = mParticleShader->getShaderConstHandle( "$alphaFactor" );
       mParticleShaderConsts.mAlphaScaleSC = mParticleShader->getShaderConstHandle( "$alphaScale" );
+      mParticleShaderConsts.mGlowSC = mParticleShader->getShaderConstHandle("$glow");
       mParticleShaderConsts.mFSModelViewProjSC = mParticleShader->getShaderConstHandle( "$fsModelViewProj" );
       mParticleShaderConsts.mDeferredTargetParamsSC = mParticleShader->getShaderConstHandle( "$deferredTargetParams" );
 

+ 1 - 0
Engine/source/renderInstance/renderParticleMgr.h

@@ -112,6 +112,7 @@ protected:
       GFXShaderConstHandle *mDeferredTargetParamsSC;
       GFXShaderConstHandle *mAlphaFactorSC;
       GFXShaderConstHandle *mAlphaScaleSC;
+      GFXShaderConstHandle* mGlowSC;
       GFXShaderConstHandle *mSamplerDiffuse;
       GFXShaderConstHandle *mSamplerDeferredTex;
       GFXShaderConstHandle *mSamplerParaboloidLightMap;

+ 6 - 1
Templates/BaseGame/game/core/rendering/shaders/gl/particlesP.glsl

@@ -77,6 +77,7 @@ vec4 lmSample( vec3 nrm )
 
 uniform float alphaFactor;
 uniform float alphaScale;
+uniform int glow;
 
 out vec4 OUT_col;
 
@@ -106,7 +107,11 @@ void main()
    
    // Scale output color by the alpha factor (turn LerpAlpha into pre-multiplied alpha)
    vec3 colorScale = ( alphaFactor < 0.0 ? IN_color.rgb * diffuse.rgb : vec3( alphaFactor > 0.0 ? IN_color.a * diffuse.a * alphaFactor * softBlend : softBlend ) );
-   
+   if (glow >0)
+   {
+      vec4 glowCol = vec4(pow(max((IN_color * diffuse).rgb*10,0.0),3.54406804435),(IN_color * diffuse).a);
+      colorScale *= glowCol.rgb;
+   }
    OUT_col = hdrEncode( vec4( IN_color.rgb * diffuse.rgb * colorScale,
                   IN_color.a * diffuse.a * softBlend * alphaScale ) );
 }

+ 6 - 1
Templates/BaseGame/game/core/rendering/shaders/particlesP.hlsl

@@ -75,6 +75,7 @@ float4 lmSample( float3 nrm )
 
 uniform float alphaFactor;
 uniform float alphaScale;
+uniform int glow;
 
 float4 main( Conn IN ) : TORQUE_TARGET0
 {
@@ -102,7 +103,11 @@ float4 main( Conn IN ) : TORQUE_TARGET0
    
    // Scale output color by the alpha factor (turn LerpAlpha into pre-multiplied alpha)
    float3 colorScale = ( alphaFactor < 0.0 ? IN.color.rgb * diffuse.rgb : ( alphaFactor > 0.0 ? IN.color.a * diffuse.a * alphaFactor * softBlend : softBlend ) );
-   
+   if (glow >0)
+   {
+      float4 glowCol = float4(pow(max((IN.color * diffuse).rgb*10,0.0),3.54406804435),(IN.color * diffuse).a);
+      colorScale *= glowCol.rgb;
+   }
    return hdrEncode( float4( IN.color.rgb * diffuse.rgb * colorScale,
                   IN.color.a * diffuse.a * softBlend * alphaScale ) );
 }