I'd like to obtain something like this:

Maybe a simple GLFog can do the trick?
But I think there should be a way to retrieve the depth buffer in opengl. I'll search that when I'll get home

Moderator: Moderators
It's possible using GL_FOG, but that fog is calculated per-vertex instead of per-fragment. So if you'd have a large floor ( like in your screenshot ) that consists of only 4 vertices, it won't work properly .. you'd need to tessellate the floor to get acceptable results. Here's a example ( try changing the PlaneMesh X/YCount to 0 ).
Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" CameraPosition="0 8 0" CameraRotation="0.08 0 0" FileVersion="2">
<OnLoaded>
<ZExternalLibrary ModuleName="opengl32">
<Source>
<![CDATA[//
const int GL_FOG = 0x0B60;
const int GL_FOG_END = 0x0B64;
const int GL_FOG_MODE = 0x0B65;
const int GL_FOG_COORD_SRC = 0x8450;
void glEnable(int cap){}
void glFogi(int pname, int param){}]]>
</Source>
</ZExternalLibrary>
<ZExpression>
<Expression>
<![CDATA[//
glFogi(GL_FOG_MODE, 0x2601);
glFogi(GL_FOG_END, 32);
glFogi(GL_FOG_COORD_SRC, 0x8452);
glEnable(GL_FOG);]]>
</Expression>
</ZExpression>
<SpawnModel Model="Model"/>
</OnLoaded>
<OnUpdate>
<ZExpression>
<Expression>
<![CDATA[//
App.CameraRotation.Y = App.Time/16;
//
float a = App.CameraRotation.Y*PI*2;
App.CameraPosition.X = -sin(a)*16;
App.CameraPosition.Z = cos(a)*16;]]>
</Expression>
</ZExpression>
</OnUpdate>
<Content>
<Model Name="Model" Rotation="0 0.18 0">
<OnRender>
<UseMaterial Material="FogMaterial"/>
<RenderTransformGroup Scale="32 32 1" Translate="0 -4 0" Rotate="0.75 0 0">
<Children>
<RenderMesh Mesh="PlaneMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="3 3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="-3 3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 3 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 3 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="3 -3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="-3 -3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 -3 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 -3 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="3 0 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="-3 0 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="-3 0 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="3 0 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
</OnRender>
</Model>
<Mesh Name="BoxMesh">
<Producers>
<MeshBox/>
</Producers>
</Mesh>
<Mesh Name="PlaneMesh">
<Producers>
<MeshBox XCount="31" YCount="31" Grid2DOnly="255"/>
</Producers>
</Mesh>
<Material Name="FogMaterial" Shading="1" Light="0"/>
</Content>
</ZApplication>
Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<ZApplication Name="App" Caption="ZGameEditor application" CameraPosition="-15.7819 8 -2.6327" CameraRotation="0.08 5.2763 0" FileVersion="2">
<OnLoaded>
<ZExternalLibrary ModuleName="opengl32">
<Source>
<![CDATA[//
const int GL_FOG = 0x0B60;
const int GL_FOG_END = 0x0B64;
const int GL_FOG_MODE = 0x0B65;
const int GL_FOG_COORD_SRC = 0x8450;
void glEnable(int cap){}
void glFogi(int pname, int param){}]]>
</Source>
</ZExternalLibrary>
<ZExpression>
<Expression>
<![CDATA[//
glFogi(GL_FOG_MODE, 0x2601);
glFogi(GL_FOG_END, 32);
glFogi(GL_FOG_COORD_SRC, 0x8452);
glEnable(GL_FOG);]]>
</Expression>
</ZExpression>
<SpawnModel Model="Model"/>
</OnLoaded>
<OnUpdate>
<ZExpression>
<Expression>
<![CDATA[//
App.CameraRotation.Y = App.Time/16;
//
float a = App.CameraRotation.Y*PI*2;
App.CameraPosition.X = -sin(a)*16;
App.CameraPosition.Z = cos(a)*16;]]>
</Expression>
</ZExpression>
</OnUpdate>
<Content>
<Model Name="Model" Rotation="0 0.18 0">
<OnRender>
<UseMaterial Material="FogMaterial"/>
<RenderTransformGroup Scale="32 32 1" Translate="0 -4 0" Rotate="0.75 0 0">
<Children>
<RenderMesh Mesh="PlaneMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="3 3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="-3 3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 3 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 3 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="3 -3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 1 4" Translate="-3 -3 0">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 -3 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="2 1 1" Translate="0 -3 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="3 0 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="-3 0 3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="-3 0 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
<RenderTransformGroup Scale="1 2 1" Translate="3 0 -3">
<Children>
<RenderMesh Mesh="BoxMesh"/>
</Children>
</RenderTransformGroup>
</OnRender>
</Model>
<Mesh Name="BoxMesh">
<Producers>
<MeshBox/>
</Producers>
</Mesh>
<Mesh Name="PlaneMesh">
<Producers>
<MeshBox XCount="32" YCount="32" Grid2DOnly="255"/>
</Producers>
</Mesh>
<Material Name="FogMaterial" Shading="1" Light="0" Shader="DepthMapShader">
<Textures>
<MaterialTexture Texture="TextureBitmap" TexCoords="1"/>
</Textures>
</Material>
<Shader Name="DepthMapShader">
<FragmentShaderSource>
<![CDATA[void main()
{
float ndcDepth =
(2.0 * gl_FragCoord.z - gl_DepthRange.near - gl_DepthRange.far) /
(gl_DepthRange.far - gl_DepthRange.near);
float clipDepth = ndcDepth / gl_FragCoord.w;
gl_FragColor = vec4((1 - clipDepth * 0.012));
}]]>
</FragmentShaderSource>
</Shader>
<Bitmap Name="TextureBitmap">
<Producers>
<BitmapCells/>
</Producers>
</Bitmap>
</Content>
</ZApplication>
Code: Select all
if (PhotoMode) MyMaterial.Shader = DepthShader;