TBuffer gbuffer=CreateBuffer(GraphicsWidth(),GraphicsHeight(),BUFFER_COLOR|BUFFER_DEPTH|BUFFER_NORMAL);
TBuffer lightbuffer=CreateBuffer(GraphicsWidth(),GraphicsHeight(),BUFFER_COLOR|BUFFER_DEPTH);
TBuffer reflectionbuffer=CreateBuffer(GraphicsWidth(),GraphicsHeight(),BUFFER_COLOR|BUFFER_DEPTH|BUFFER_NORMAL);//gbuffer for rendering reflections
TBuffer reflectionlightbuffer=CreateBuffer(GraphicsWidth(),GraphicsHeight(),BUFFER_COLOR|BUFFER_DEPTH);//buffer for rendering reflection lighting to
...
...
...
TWorld background=CreateWorld();
TMesh skybox=CreateCube();
TCamera skycam=CreateCamera();
FlipMesh(skybox);
PaintEntity(skybox,LoadMaterial("abstract::FullskiesBlueClear0016_2_L.mat"));
foreground=CreateWorld();
waterplane=CreateMesh();
TSurface surf=CreateSurface(waterplane);
AddVertex(surf,Vec3(0.5,0,-0.5));
AddVertex(surf,Vec3(0.5,0,0.5));
AddVertex(surf,Vec3(-0.5,0,0.5));
AddVertex(surf,Vec3(-0.5,0,-0.5));
AddTriangle(surf,0,2,1);
AddTriangle(surf,2,0,3);
UpdateMesh(waterplane);
PositionEntity(waterplane,Vec3(0,29,0));
ScaleEntity(waterplane,Vec3(2048));
EntityOcclusionMode(waterplane,1);
fgcam = CreateCamera();
CameraClearMode(fgcam,0);
SetWorld(world);
TBody waterbody=CreateBodyBox(20,20,20);
EntityType(waterbody,4);
PositionEntity(waterbody,Vec3(0,12-10,0));
EntityParent(waterbody,waterplane);
SetFluidPlane(Vec4(0.0,1.0,0.0,-EntityPosition(waterplane).Y),0.1);
SetFluidDensity(1);
SetFluidViscosity(0,0);
reflectioncam=CreateCamera();
HideEntity(reflectioncam);
TMaterial watermaterial=LoadMaterial("abstract::water.mat");
SetMaterialTexture(watermaterial,GetColorBuffer(reflectionlightbuffer),2);
SetMaterialTexture(watermaterial,GetColorBuffer(lightbuffer),3);
SetMaterialTexture(watermaterial,GetDepthBuffer(gbuffer),4);
TShader watershader=GetMaterialShader(watermaterial);
SetShaderFloat(watershader,"visibility",10.0); // Дальность вида в глубину
SetShaderFloat(watershader,"softness",10.0); // Прозрачность воды
TMaterial underwatermaterial=LoadMaterial("abstract::underwater.mat");
SetMaterialTexture(underwatermaterial,GetColorBuffer(reflectionlightbuffer),2);
SetMaterialTexture(underwatermaterial,GetColorBuffer(lightbuffer),3);
SetMaterialTexture(underwatermaterial,GetDepthBuffer(gbuffer),4);
TShader postfilter=LoadShader("abstract::postfilter.vert","abstract::postfilter_distancefog_wobble.frag");
SetShaderVec4(postfilter,"fogcolor",Vec4(1.02,1.59,1.74,1.0));
SetShaderVec2(postfilter,"fogrange",Vec2(0,5));
wobbletexture=LoadTexture("abstract::wobbledot3.dds");
...
...
...
while( !KeyHit() && !AppTerminate() ) {
UpdateAppTime();
UpdateWorld();
//UpdateWorld(AppSpeed());
SetBuffer(gbuffer);
SetWorld(background);
RenderWorld();
SetWorld(world);
RenderWorld();
SetBuffer(BackBuffer());
RenderLights(gbuffer);
SetBuffer(lightbuffer);
RenderLights(gbuffer);
CopyBuffer(gbuffer,BackBuffer(),BUFFER_DEPTH);
CopyBuffer(lightbuffer,BackBuffer(),BUFFER_COLOR);
if (EntityPosition(camera).Y>EntityPosition(waterplane).Y) {
if (!EntityCulled(waterplane,fgcam)) {
PaintEntity(waterplane,watermaterial);
SetShadowQuality(1);//low-quality shadows are fine when rendering reflections
SetBuffer(reflectionbuffer); // Включаем рефлёность воды с отражением
ShowEntity(reflectioncam); //Выводим отражение
HideEntity(camera); //Скрываем камеру
float waterheight=EntityPosition(waterplane).Y;
SetCameraClipPlane(reflectioncam,0,Vec4(0,1,0,-waterheight));
TVec3 pos = EntityPosition(camera);
TVec3 rot = EntityRotation(camera);
pos.Y=waterheight-(pos.Y-waterheight);
PositionEntity(reflectioncam,pos);
ScaleEntity(reflectioncam,Vec3(1,-1,1));
RotateEntity(reflectioncam,Vec3(-rot.X,rot.Y,rot.Z));
RenderWorld(); //Now render lighting for the reflection
SetBuffer(reflectionlightbuffer);
RenderLights(reflectionbuffer);
//Restore settings
ShowEntity(camera);
HideEntity(reflectioncam);
SetShadowQuality(1);
}
SetWorld(foreground);
SetBuffer(BackBuffer());
SetEntityMatrix(fgcam,GetEntityMatrix(camera));
RenderWorld();
} else {
PaintEntity(waterplane,underwatermaterial);
SetWorld(foreground);
SetBuffer(gbuffer);
CopyBuffer(lightbuffer,gbuffer,BUFFER_COLOR|BUFFER_DEPTH);
CopyBuffer(lightbuffer,gbuffer,BUFFER_COLOR|BUFFER_DEPTH);
SetEntityMatrix(fgcam,GetEntityMatrix(camera));
RenderWorld();
SetBuffer(BackBuffer());
SetShader(postfilter);
BindTexture(GetDepthBuffer(gbuffer),1);
BindTexture(wobbletexture,7);
TTexture tex=GetColorBuffer(gbuffer);
TextureFilter(tex,TEXFILTER_SMOOTH);
DrawImage(tex,0,TextureHeight(tex),TextureWidth(tex),-TextureHeight(tex));
TextureFilter(tex,TEXFILTER_PIXEL);
SetShader(NULL);
}
}
Sample from tutorial clear!