Re: Adding Wind to Grass
Posted: Sun Jul 12, 2020 9:02 am
Oh, I see. I didn't consider alignment in that respect. Dark_sylinc, is it ok to use a float without 3 pads or what?
Support and community hang-out spot for Ogre3D
https://forums.ogre3d.org/
you have to actually use the passBuff fog params in your shader, this is a simple linear fog:
Code: Select all
float fogDistance = length( inPs.pos );
float fogFactor = 1.0-clamp((passBuf.fogEnd - fogDistance) / (passBuf.fogEnd - passBuf.fogStart),0.0,1.0);
finalColour.xyz = lerp( finalColour, passBuf.fogColor, fogFactor );
Code: Select all
mAutoParamDataSource->setFog( mCurrentSceneManager->getFogMode(),
mCurrentSceneManager->getFogColour(),
mCurrentSceneManager->getFogDensity(),
mCurrentSceneManager->getFogStart(),
mCurrentSceneManager->getFogEnd() );
Code: Select all
@piece( custom_vs_uniformDeclaration)
Texture3D texPerlinNoise : register( t14 );
SamplerState texPerlinNoiseSampler : register( s14);
@end
@piece( custom_vs_preTransform )
@property(wind_enabled)
float windFactor = 1.0 - input.uv0.y;
float random = texPerlinNoise.SampleLevel(texPerlinNoiseSampler, 0.2 * worldPos.xyz + float3(0.3, 0.3, 0.3) * passBuf.globalTime, 0).xyz - float3(0.2, 0.2, 0.2);
worldPos.xyz += random * windFactor * passBuf.windStrength;
@end
@end
Code: Select all
@piece(custom_ps_posExecution)
@property(!hlms_shadowcaster)
//Linear Fog
float fogDistance = length( inPs.pos );
float fogFactor = 1.0 - clamp((passBuf.fogParams.y - fogDistance) / (passBuf.fogParams.y - passBuf.fogParams.x), 0.0, 1.0);
finalColour.xyz = lerp(finalColour, passBuf.fogColor, fogFactor);
@end
@end
Code: Select all
@piece( custom_passBuffer )
//Fog
float4 fogParams;
float4 fogColor;
//wind
float windStrength;
float globalTime;
float padding0;
float padding1;
@end
Code: Select all
...
Ogre::uint32 HlmsWindListener::getPassBufferSize(const Ogre::CompositorShadowNode* shadowNode, bool casterPass, bool dualParaboloid, Ogre::SceneManager* sceneManager) const
{
Ogre::uint32 size = 0;
if (!casterPass)
{
unsigned int fogSize = sizeof(float) * 4 * 2; // float4 + float4 in bytes
unsigned int windSize = sizeof(float);
unsigned int timeSize = sizeof(float);
unsigned int padding0 = sizeof(float);
unsigned int padding1 = sizeof(float);
size += fogSize + windSize + timeSize + padding0 + padding1;
}
return size;
}
float* HlmsWindListener::preparePassBuffer(const Ogre::CompositorShadowNode* shadowNode, bool casterPass, bool dualParaboloid, Ogre::SceneManager* sceneManager, float* passBufferPtr)
{
if (!casterPass)
{
//Linear Fog parameters
*passBufferPtr++ = sceneManager->getFogStart();
*passBufferPtr++ = sceneManager->getFogEnd();
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = sceneManager->getFogColour().r;
*passBufferPtr++ = sceneManager->getFogColour().g;
*passBufferPtr++ = sceneManager->getFogColour().b;
*passBufferPtr++ = 1.0f;
*passBufferPtr++ = this->windStrength;
*passBufferPtr++ = this->globalTime;
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = 0.0f;
}
return passBufferPtr;
}
..
this->hlmsWind = dynamic_cast<HlmsWind*>(Ogre::Root::getSingleton().getHlmsManager()->getHlms(Ogre::HLMS_USER0));
hlmsWind->setup(this->gameObjectPtr->getSceneManager());
sceneManager->setFog(Ogre::FOG_LINEAR, Ogre::ColourValue(1, 1, 1), 0.0f, 10.0f, 300.0f);
Yes I also tried that. I also updated to newest Ogre version. I think I will give uptry manually setting the fog params to something like color = white, min = 10, max=300. Or something that makes sense just to check
Code: Select all
outPs_colour0.xyz = lerp( finalColour, passBuf.fogColor, fogFactor );
Code: Select all
finalColour.xyz = lerp(finalColour, passBuf.fogColor, fogFactor);
Code: Select all
460: add r0.x, -r0.x, passBuf.fogParams.y
461: add r1.x, -passBuf.fogParams.x, passBuf.fogParams.y
462: div_sat r0.x, r0.x, r1.x
463: add r0.x, -r0.x, l(1.0000)
464: add r1.xyz, -r0.yzwy, passBuf.fogColor.xyzx
465: mad o0.xyz, r0.xxxx, r1.xyzx, r0.yzwy
466: ret
you can easily test that by hardcoding some values... instead of:
Code: Select all
//Linear Fog parameters
*passBufferPtr++ = sceneManager->getFogStart();
*passBufferPtr++ = sceneManager->getFogEnd();
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = sceneManager->getFogColour().r;
*passBufferPtr++ = sceneManager->getFogColour().g;
*passBufferPtr++ = sceneManager->getFogColour().b;
*passBufferPtr++ = 1.0f;
Code: Select all
//Linear Fog parameters
*passBufferPtr++ = 10;
*passBufferPtr++ = 50;
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = 0.0f;
*passBufferPtr++ = 1.0;
*passBufferPtr++ = 0.0;
*passBufferPtr++ = 0.0;
*passBufferPtr++ = 1.0f;
Yes, thats exactly the case, see:strange! are the other objects also using HlmsPbsDatablocks? what if you set same grass datablock to another object?
Code: Select all
Unlit:
+ [0] "Hlms/Common/HLSL"
+ [1] "Hlms/Common/Any"
+ [2] "Hlms/Unlit/Any"
Pbs:
+ [0] "Hlms/Common/HLSL"
+ [1] "Hlms/Common/Any"
+ [2] "Hlms/Pbs/Any"
+ [3] "Hlms/Pbs/Any/Main"
Terra:
+ [0] "Hlms/Common/HLSL"
+ [1] "Hlms/Common/Any"
+ [2] "Hlms/Pbs/Any"
+ [3] "Hlms/Pbs/Any/Main"
+ [4] "Hlms/Terra/Any"
+ [5] "Hlms/Terra/HLSL/PbsTerraShadows"
Wind:
+ [0] "Hlms/Common/HLSL"
+ [1] "Hlms/Common/Any"
+ [2] "Hlms/Pbs/Any"
+ [3] "Hlms/Pbs/Any/Main"
+ [4] "Hlms/Wind/Any"
Ahh thats a good advice. I will try that out.You need to implement fog on whichever hlms need to use it