Selaa lähdekoodia

Added cubic environment mapping shaders, techniques & example materials.
Fixed bug in loading cube map miplevel 0 if mips were skipped.

Lasse Öörni 13 vuotta sitten
vanhempi
sitoutus
e64d64034e

+ 12 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.frag

@@ -30,6 +30,9 @@ varying vec2 vTexCoord;
     #else
     #else
         varying vec4 vScreenPos;
         varying vec4 vScreenPos;
     #endif
     #endif
+    #ifdef ENVCUBEMAP
+        varying vec3 vReflectionVec;
+    #endif
 #endif
 #endif
 
 
 void main()
 void main()
@@ -125,6 +128,11 @@ void main()
         gl_FragData[0] = vec4(GetFog(vVertexLight.rgb * diffColor.rgb, vVertexLight.a), 1.0);
         gl_FragData[0] = vec4(GetFog(vVertexLight.rgb * diffColor.rgb, vVertexLight.a), 1.0);
         gl_FragData[1] = GetFogFactor(vVertexLight.a) * vec4(diffColor.rgb, specIntensity);
         gl_FragData[1] = GetFogFactor(vVertexLight.a) * vec4(diffColor.rgb, specIntensity);
         gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
         gl_FragData[2] = vec4(normal * 0.5 + 0.5, specPower);
+        
+        #ifdef ENVCUBEMAP
+            gl_FragData[0].rgb += cMatEnvMapColor * textureCube(sEnvCubeMap, vReflectionVec);
+        #endif
+
         #ifndef HWDEPTH
         #ifndef HWDEPTH
             gl_FragData[3] = vec4(EncodeDepth(vVertexLight.a), 0.0);
             gl_FragData[3] = vec4(EncodeDepth(vVertexLight.a), 0.0);
         #endif
         #endif
@@ -141,6 +149,10 @@ void main()
             finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
             finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
         #endif
         #endif
 
 
+        #ifdef ENVCUBEMAP
+            finalColor.rgb += cMatEnvMapColor * textureCube(sEnvCubeMap, vReflectionVec);
+        #endif
+
         gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
         gl_FragColor = vec4(GetFog(finalColor, vVertexLight.a), diffColor.a);
     #endif
     #endif
 }
 }

+ 7 - 0
Bin/CoreData/Shaders/GLSL/LitSolid.vert

@@ -30,6 +30,9 @@ varying vec2 vTexCoord;
     #else
     #else
         varying vec4 vScreenPos;
         varying vec4 vScreenPos;
     #endif
     #endif
+    #ifdef ENVCUBEMAP
+        varying vec3 vReflectionVec;
+    #endif
 #endif
 #endif
 
 
 void main()
 void main()
@@ -102,5 +105,9 @@ void main()
         #ifndef NORMALMAP
         #ifndef NORMALMAP
             vScreenPos = GetScreenPos(gl_Position);
             vScreenPos = GetScreenPos(gl_Position);
         #endif
         #endif
+        
+        #ifdef ENVCUBEMAP
+            vReflectionVec = reflect(worldPos - cCameraPos, vNormal);
+        #endif
     #endif
     #endif
 }
 }

+ 10 - 8
Bin/CoreData/Shaders/GLSL/LitSolid.xml

@@ -1,20 +1,21 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
         <option name="Normal" define="NORMALMAP" />
         <option name="Normal" define="NORMALMAP" />
+        <option name="EnvCube" define="ENVCUBEMAP" />
         <variation name="" define="AMBIENT" />
         <variation name="" define="AMBIENT" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
         <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
         <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
         <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
         <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="Dir">
+        <variation name="Dir" exclude="EnvCube">
             <define name="DIRLIGHT" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Spot">
+        <variation name="Spot" exclude="EnvCube">
             <define name="SPOTLIGHT" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Point">
+        <variation name="Point" exclude="EnvCube">
             <define name="POINTLIGHT" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
@@ -28,22 +29,23 @@
         <option name="Diff" define="DIFFMAP" />
         <option name="Diff" define="DIFFMAP" />
         <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
         <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
+        <option name="EnvCube" define="ENVCUBEMAP" />
         <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
         <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
-        <variation name="" define="AMBIENT" />        
-        <variation name="Dir">
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir" exclude="EnvCube">
             <define name="DIRLIGHT" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Spot">
+        <variation name="Spot" exclude="EnvCube">
             <define name="SPOTLIGHT" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Point">
+        <variation name="Point" exclude="EnvCube">
             <define name="POINTLIGHT" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Prepass" define="PREPASS" />
+        <variation name="Prepass" define="PREPASS" exclude="EnvCube" />
         <variation name="Material" define="MATERIAL" exclude="Normal" />
         <variation name="Material" define="MATERIAL" exclude="Normal" />
         <variation name="Deferred" define="DEFERRED" />
         <variation name="Deferred" define="DEFERRED" />
         <option name="HW" define="HWDEPTH" require="PREPASS" />
         <option name="HW" define="HWDEPTH" require="PREPASS" />

+ 19 - 0
Bin/CoreData/Shaders/HLSL/LitSolid.hlsl

@@ -53,6 +53,9 @@ void VS(float4 iPos : POSITION,
         #else
         #else
             out float4 oScreenPos : TEXCOORD3,
             out float4 oScreenPos : TEXCOORD3,
         #endif
         #endif
+        #ifdef ENVCUBEMAP
+            out float3 oReflectionVec : TEXCOORD5,
+        #endif
     #endif
     #endif
     out float4 oPos : POSITION)
     out float4 oPos : POSITION)
 {
 {
@@ -118,6 +121,10 @@ void VS(float4 iPos : POSITION,
         #ifndef NORMALMAP
         #ifndef NORMALMAP
             oScreenPos = GetScreenPos(oPos);
             oScreenPos = GetScreenPos(oPos);
         #endif
         #endif
+        
+        #ifdef ENVCUBEMAP
+            oReflectionVec = reflect(worldPos - cCameraPos, oNormal);
+        #endif
     #endif
     #endif
 }
 }
 
 
@@ -148,6 +155,9 @@ void PS(float2 iTexCoord : TEXCOORD0,
         #else
         #else
             float4 iScreenPos : TEXCOORD3,
             float4 iScreenPos : TEXCOORD3,
         #endif
         #endif
+        #ifdef ENVCUBEMAP
+            float3 iReflectionVec : TEXCOORD5,
+        #endif
     #endif
     #endif
     #if defined(PREPASS) && !defined(HWDEPTH)
     #if defined(PREPASS) && !defined(HWDEPTH)
         out float4 oDepth : COLOR1,
         out float4 oDepth : COLOR1,
@@ -255,6 +265,11 @@ void PS(float2 iTexCoord : TEXCOORD0,
         oColor = float4(GetFog(iVertexLight.rgb * diffColor.rgb, iVertexLight.a), 1.0);
         oColor = float4(GetFog(iVertexLight.rgb * diffColor.rgb, iVertexLight.a), 1.0);
         oAlbedo = GetFogFactor(iVertexLight.a) * float4(diffColor.rgb, specIntensity);
         oAlbedo = GetFogFactor(iVertexLight.a) * float4(diffColor.rgb, specIntensity);
         oNormal = float4(normal * 0.5 + 0.5, specPower);
         oNormal = float4(normal * 0.5 + 0.5, specPower);
+
+        #ifdef ENVCUBEMAP
+            oColor.rgb += cMatEnvMapColor * texCUBE(sEnvCubeMap, iReflectionVec);
+        #endif
+
         #ifndef HWDEPTH
         #ifndef HWDEPTH
             oDepth = iVertexLight.a;
             oDepth = iVertexLight.a;
         #endif
         #endif
@@ -271,6 +286,10 @@ void PS(float2 iTexCoord : TEXCOORD0,
             finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
             finalColor += lightInput.rgb * diffColor.rgb + lightSpecColor * specColor;
         #endif
         #endif
 
 
+        #ifdef ENVCUBEMAP
+            finalColor += cMatEnvMapColor * texCUBE(sEnvCubeMap, iReflectionVec);
+        #endif
+
         oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
         oColor = float4(GetFog(finalColor, iVertexLight.a), diffColor.a);
     #endif
     #endif
 }
 }

+ 11 - 9
Bin/CoreData/Shaders/HLSL/LitSolid.xml

@@ -1,20 +1,21 @@
 <shaders>
 <shaders>
     <shader type="vs">
     <shader type="vs">
         <option name="Normal" define="NORMALMAP" />
         <option name="Normal" define="NORMALMAP" />
+        <option name="EnvCube" define="ENVCUBEMAP" />
         <variation name="" define="AMBIENT" />
         <variation name="" define="AMBIENT" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="1VL" define="NUMVERTEXLIGHTS=1" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
         <variation name="2VL" define="NUMVERTEXLIGHTS=2" />
         <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
         <variation name="3VL" define="NUMVERTEXLIGHTS=3" />
         <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
         <variation name="4VL" define="NUMVERTEXLIGHTS=4" />
-        <variation name="Dir">
+        <variation name="Dir" exclude="EnvCube">
             <define name="DIRLIGHT" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Spot">
+        <variation name="Spot" exclude="EnvCube">
             <define name="SPOTLIGHT" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Point">
+        <variation name="Point" exclude="EnvCube">
             <define name="POINTLIGHT" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
@@ -29,22 +30,23 @@
         <option name="Diff" define="DIFFMAP" />
         <option name="Diff" define="DIFFMAP" />
         <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
         <option name="Normal" define="NORMALMAP" require="DIFFMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
         <option name="SpecMap" define="SPECMAP" require="DIFFMAP" />
-        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />        
+        <option name="EnvCube" define="ENVCUBEMAP" />
+        <option name="AlphaMask" define="ALPHAMASK" require="DIFFMAP" />
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
         <option name="Ambient" define="AMBIENT" require="PERPIXEL" />
-        <variation name="" define="AMBIENT" />        
-        <variation name="Dir">
+        <variation name="" define="AMBIENT" />
+        <variation name="Dir" exclude="EnvCube">
             <define name="DIRLIGHT" />
             <define name="DIRLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Spot">
+        <variation name="Spot" exclude="EnvCube">
             <define name="SPOTLIGHT" />
             <define name="SPOTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Point">
+        <variation name="Point" exclude="EnvCube">
             <define name="POINTLIGHT" />
             <define name="POINTLIGHT" />
             <define name="PERPIXEL" />
             <define name="PERPIXEL" />
         </variation>
         </variation>
-        <variation name="Prepass" define="PREPASS" />
+        <variation name="Prepass" define="PREPASS" exclude="EnvCube" />
         <variation name="Material" define="MATERIAL" exclude="Normal" />
         <variation name="Material" define="MATERIAL" exclude="Normal" />
         <variation name="Deferred" define="DEFERRED" />
         <variation name="Deferred" define="DEFERRED" />
         <option name="HW" define="HWDEPTH" require="PREPASS" />
         <option name="HW" define="HWDEPTH" require="PREPASS" />

+ 8 - 0
Bin/CoreData/Techniques/DiffEnvCube.xml

@@ -0,0 +1,8 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCube" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_DiffPrepass" />
+    <pass name="material" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCubeMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCubeDeferred" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 5 - 0
Bin/CoreData/Techniques/DiffEnvCubeAlpha.xml

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCube" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid_Diff" depthwrite="false" blend="addalpha" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 8 - 0
Bin/CoreData/Techniques/DiffNormalEnvCube.xml

@@ -0,0 +1,8 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCube" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid_Normal" ps="LitSolid_DiffNormalPrepass" />
+    <pass name="material" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCubeMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_NormalEnvCube" ps="LitSolid_DiffNormalEnvCubeDeferred" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 5 - 0
Bin/CoreData/Techniques/DiffNormalEnvCubeAlpha.xml

@@ -0,0 +1,5 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_DiffEnvCube" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid_Normal" ps="LitSolid_DiffNormal" depthwrite="false" blend="addalpha" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 8 - 0
Bin/CoreData/Techniques/NoTextureEnvCube.xml

@@ -0,0 +1,8 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_EnvCube" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthtest="equal" depthwrite="false" blend="add" />
+    <pass name="prepass" vs="LitSolid" ps="LitSolid_Prepass" />
+    <pass name="material" vs="LitSolid_EnvCube" ps="LitSolid_EnvCubeMaterial" depthtest="equal" depthwrite="false" />
+    <pass name="deferred" vs="LitSolid_EnvCube" ps="LitSolid_EnvCubeDeferred" />
+    <pass name="shadow" vs="Shadow" ps="Shadow" />
+</technique>

+ 4 - 0
Bin/CoreData/Techniques/NoTextureEnvCubeAlpha.xml

@@ -0,0 +1,4 @@
+<technique>
+    <pass name="base" vs="LitSolid_EnvCube" ps="LitSolid_EnvCube" depthwrite="false" blend="alpha" />
+    <pass name="light" vs="LitSolid" ps="LitSolid" depthwrite="false" blend="addalpha" />
+</technique>

+ 6 - 0
Bin/Data/Materials/JackEnvMap.xml

@@ -0,0 +1,6 @@
+<material>
+    <technique name="Techniques/NoTextureEnvCube.xml" />
+    <texture unit="environment" name="Textures/Skybox.xml" />
+    <parameter name="MatSpecColor" value="0.5 0.5 0.5 16" />
+    <parameter name="MatEnvMapColor" value="0.2 0.2 0.2" />
+</material>

+ 7 - 0
Bin/Data/Materials/MushroomEnvMap.xml

@@ -0,0 +1,7 @@
+<material>
+    <technique name="Techniques/DiffEnvCube.xml" />
+    <texture unit="diffuse" name="Textures/Mushroom.dds" />
+    <texture unit="environment" name="Textures/Skybox.xml" />
+    <parameter name="MatSpecColor" value="0.1 0.1 0.1 16" />
+    <parameter name="MatEnvMapColor" value="0.2 0.1 0.1" />
+</material>

+ 9 - 0
Bin/Data/Materials/StoneEnvMap.xml

@@ -0,0 +1,9 @@
+<material>
+    <technique name="Techniques/DiffNormalEnvCube.xml" quality="1" />
+    <technique name="Techniques/DiffEnvCube.xml" quality="0" />
+    <texture unit="diffuse" name="Textures/StoneDiffuse.dds" />
+    <texture unit="normal" name="Textures/StoneNormal.dds" />
+    <texture unit="environment" name="Textures/Skybox.xml" />
+    <parameter name="MatSpecColor" value="0.3 0.3 0.3 16" />
+    <parameter name="MatEnvMapColor" value="0.1 0.1 0.2" />
+</material>

BIN
Bin/Data/Textures/BrightDay1_NegX.png


BIN
Bin/Data/Textures/BrightDay1_NegY.png


BIN
Bin/Data/Textures/BrightDay1_NegZ.png


BIN
Bin/Data/Textures/BrightDay1_PosX.png


BIN
Bin/Data/Textures/BrightDay1_PosY.png


BIN
Bin/Data/Textures/BrightDay1_PosZ.png


+ 8 - 0
Bin/Data/Textures/SkyBox.xml

@@ -0,0 +1,8 @@
+<cubemap>
+    <face name="BrightDay1_PosX.png" />
+    <face name="BrightDay1_NegX.png" />
+    <face name="BrightDay1_PosY.png" />
+    <face name="BrightDay1_NegY.png" />
+    <face name="BrightDay1_PosZ.png" />
+    <face name="BrightDay1_NegZ.png" />
+</cubemap>

+ 2 - 0
Docs/Urho3D.dox

@@ -88,6 +88,8 @@ Jack and mushroom models from the realXtend project. (http://www.realxtend.org)
 
 
 Ninja model and terrain / smoke / flare / status bar textures from OGRE.
 Ninja model and terrain / smoke / flare / status bar textures from OGRE.
 
 
+Skybox cubemap from http://www.codemonsters.de.
+
 BlueHighway font from Larabie Fonts.
 BlueHighway font from Larabie Fonts.
 
 
 Anonymous Pro font by Mark Simonson.
 Anonymous Pro font by Mark Simonson.

+ 2 - 1
Engine/Graphics/Direct3D9/D3D9TextureCube.cpp

@@ -381,6 +381,7 @@ bool TextureCube::Load(CubeMapFace face, SharedPtr<Image> image, bool useAlpha)
         for (unsigned i = 0; i < mipsToSkip_[quality]; ++i)
         for (unsigned i = 0; i < mipsToSkip_[quality]; ++i)
         {
         {
             image = image->GetNextLevel();
             image = image->GetNextLevel();
+            levelData = image->GetData();
             levelWidth = image->GetWidth();
             levelWidth = image->GetWidth();
             levelHeight = image->GetHeight();
             levelHeight = image->GetHeight();
         }
         }
@@ -425,7 +426,7 @@ bool TextureCube::Load(CubeMapFace face, SharedPtr<Image> image, bool useAlpha)
         {
         {
             SetData(face, i, 0, 0, levelWidth, levelHeight, levelData);
             SetData(face, i, 0, 0, levelWidth, levelHeight, levelData);
             memoryUse += levelWidth * levelHeight * components;
             memoryUse += levelWidth * levelHeight * components;
-
+            
             if (i < levels_ - 1)
             if (i < levels_ - 1)
             {
             {
                 image = image->GetNextLevel();
                 image = image->GetNextLevel();

+ 1 - 0
Engine/Graphics/OpenGL/OGLTextureCube.cpp

@@ -335,6 +335,7 @@ bool TextureCube::Load(CubeMapFace face, SharedPtr<Image> image, bool useAlpha)
         for (unsigned i = 0; i < mipsToSkip_[quality]; ++i)
         for (unsigned i = 0; i < mipsToSkip_[quality]; ++i)
         {
         {
             image = image->GetNextLevel();
             image = image->GetNextLevel();
+            levelData = image->GetData();
             levelWidth = image->GetWidth();
             levelWidth = image->GetWidth();
             levelHeight = image->GetHeight();
             levelHeight = image->GetHeight();
         }
         }

+ 2 - 0
Readme.txt

@@ -62,6 +62,8 @@ Jack and mushroom models from the realXtend project. (http://www.realxtend.org)
 
 
 Ninja model and terrain / smoke / flare / status bar textures from OGRE.
 Ninja model and terrain / smoke / flare / status bar textures from OGRE.
 
 
+Skybox cubemap from http://www.codemonsters.de.
+
 BlueHighway font from Larabie Fonts.
 BlueHighway font from Larabie Fonts.
 
 
 Anonymous Pro font by Mark Simonson.
 Anonymous Pro font by Mark Simonson.