Fixed Parallax for PBR lighting
This commit is contained in:
parent
4342d97439
commit
719a683c2c
@ -62,7 +62,7 @@ varying vec3 wPosition;
|
|||||||
uniform sampler2D m_LightMap;
|
uniform sampler2D m_LightMap;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NORMALMAP
|
#if defined(NORMALMAP) || defined(PARALLAXMAP)
|
||||||
uniform sampler2D m_NormalMap;
|
uniform sampler2D m_NormalMap;
|
||||||
varying vec3 wTangent;
|
varying vec3 wTangent;
|
||||||
varying vec3 wBinormal;
|
varying vec3 wBinormal;
|
||||||
@ -75,9 +75,14 @@ uniform float m_AlphaDiscardThreshold;
|
|||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
vec2 newTexCoord;
|
vec2 newTexCoord;
|
||||||
|
vec3 viewDir = normalize(g_CameraPosition - wPosition);
|
||||||
|
|
||||||
|
#if defined(NORMALMAP) || defined(PARALLAXMAP)
|
||||||
|
mat3 tbnMat = mat3(normalize(wTangent.xyz) , normalize(wBinormal.xyz) , normalize(wNormal.xyz));
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
|
#if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
|
||||||
|
vec3 vViewDir = viewDir * tbnMat;
|
||||||
#ifdef STEEP_PARALLAX
|
#ifdef STEEP_PARALLAX
|
||||||
#ifdef NORMALMAP_PARALLAX
|
#ifdef NORMALMAP_PARALLAX
|
||||||
//parallax map is stored in the alpha channel of the normal map
|
//parallax map is stored in the alpha channel of the normal map
|
||||||
@ -115,8 +120,6 @@ void main(){
|
|||||||
float Metallic = max(m_Metallic,0.00);
|
float Metallic = max(m_Metallic,0.00);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Roughness = max(m_Roughness,1e-8);
|
|
||||||
//Metallic = max(m_Metallic,0.00);
|
|
||||||
float alpha = Color.a * albedo.a;
|
float alpha = Color.a * albedo.a;
|
||||||
|
|
||||||
#ifdef DISCARD_ALPHA
|
#ifdef DISCARD_ALPHA
|
||||||
@ -135,6 +138,8 @@ void main(){
|
|||||||
//see http://hub.jmonkeyengine.org/forum/topic/parallax-mapping-fundamental-bug/#post-256898
|
//see http://hub.jmonkeyengine.org/forum/topic/parallax-mapping-fundamental-bug/#post-256898
|
||||||
//for more explanation.
|
//for more explanation.
|
||||||
vec3 normal = normalize((normalHeight.xyz * vec3(2.0,-2.0,2.0) - vec3(1.0,-1.0,1.0)));
|
vec3 normal = normalize((normalHeight.xyz * vec3(2.0,-2.0,2.0) - vec3(1.0,-1.0,1.0)));
|
||||||
|
normal = tbnMat * normal;
|
||||||
|
//normal = normalize(normal * inverse(tbnMat));
|
||||||
#else
|
#else
|
||||||
vec3 normal = normalize(wNormal);
|
vec3 normal = normalize(wNormal);
|
||||||
#endif
|
#endif
|
||||||
@ -151,19 +156,7 @@ void main(){
|
|||||||
albedo.rgb *= lightMapColor;
|
albedo.rgb *= lightMapColor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NORMALMAP
|
|
||||||
mat3 tbnMat = mat3(normalize(wTangent.xyz) , normalize(wBinormal.xyz) , normalize(wNormal.xyz));
|
|
||||||
normal = normalize(tbnMat * normal);
|
|
||||||
// normal = normalize(normal * inverse(tbnMat));
|
|
||||||
#endif
|
|
||||||
vec3 viewDir = normalize(g_CameraPosition - wPosition);
|
|
||||||
|
|
||||||
|
|
||||||
float specular = 0.5;
|
float specular = 0.5;
|
||||||
|
|
||||||
#ifdef SPECGLOSSPIPELINE
|
#ifdef SPECGLOSSPIPELINE
|
||||||
vec4 specularColor = texture2D(m_SpecularMap, newTexCoord);
|
vec4 specularColor = texture2D(m_SpecularMap, newTexCoord);
|
||||||
vec4 diffuseColor = albedo;
|
vec4 diffuseColor = albedo;
|
||||||
|
@ -23,7 +23,7 @@ attribute vec3 inNormal;
|
|||||||
|
|
||||||
varying vec3 wNormal;
|
varying vec3 wNormal;
|
||||||
varying vec3 wPosition;
|
varying vec3 wPosition;
|
||||||
#ifdef NORMALMAP
|
#if defined(NORMALMAP) || defined(PARALLAXMAP)
|
||||||
attribute vec4 inTangent;
|
attribute vec4 inTangent;
|
||||||
varying vec3 wTangent;
|
varying vec3 wTangent;
|
||||||
varying vec3 wBinormal;
|
varying vec3 wBinormal;
|
||||||
@ -33,7 +33,7 @@ void main(){
|
|||||||
vec4 modelSpacePos = vec4(inPosition, 1.0);
|
vec4 modelSpacePos = vec4(inPosition, 1.0);
|
||||||
vec3 modelSpaceNorm = inNormal;
|
vec3 modelSpaceNorm = inNormal;
|
||||||
|
|
||||||
#if defined(NORMALMAP) && !defined(VERTEX_LIGHTING)
|
#if ( defined(NORMALMAP) || defined(PARALLAXMAP)) && !defined(VERTEX_LIGHTING)
|
||||||
vec3 modelSpaceTan = inTangent.xyz;
|
vec3 modelSpaceTan = inTangent.xyz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ void main(){
|
|||||||
wPosition = TransformWorld(modelSpacePos).xyz;
|
wPosition = TransformWorld(modelSpacePos).xyz;
|
||||||
wNormal = TransformWorld(vec4(modelSpaceNorm,0.0)).xyz;
|
wNormal = TransformWorld(vec4(modelSpaceNorm,0.0)).xyz;
|
||||||
|
|
||||||
#if defined(NORMALMAP)
|
#if defined(NORMALMAP) || defined(PARALLAXMAP)
|
||||||
wTangent = TransformWorld(vec4(modelSpaceTan,0.0)).xyz;
|
wTangent = TransformWorld(vec4(modelSpaceTan,0.0)).xyz;
|
||||||
wBinormal = cross(wNormal, wTangent)* inTangent.w;
|
wBinormal = cross(wNormal, wTangent)* inTangent.w;
|
||||||
#endif
|
#endif
|
||||||
|
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2012 jMonkeyEngine
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
package jme3test.material;
|
||||||
|
|
||||||
|
import com.jme3.app.SimpleApplication;
|
||||||
|
import com.jme3.input.KeyInput;
|
||||||
|
import com.jme3.input.controls.ActionListener;
|
||||||
|
import com.jme3.input.controls.AnalogListener;
|
||||||
|
import com.jme3.input.controls.KeyTrigger;
|
||||||
|
import com.jme3.light.DirectionalLight;
|
||||||
|
import com.jme3.material.Material;
|
||||||
|
import com.jme3.math.*;
|
||||||
|
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
|
||||||
|
import com.jme3.scene.Geometry;
|
||||||
|
import com.jme3.scene.Node;
|
||||||
|
import com.jme3.scene.Spatial;
|
||||||
|
import com.jme3.scene.shape.Quad;
|
||||||
|
import com.jme3.util.SkyFactory;
|
||||||
|
import com.jme3.util.TangentBinormalGenerator;
|
||||||
|
|
||||||
|
public class TestParallaxPBR extends SimpleApplication {
|
||||||
|
|
||||||
|
private Vector3f lightDir = new Vector3f(-1, -1, .5f).normalizeLocal();
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
TestParallaxPBR app = new TestParallaxPBR();
|
||||||
|
app.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupSkyBox() {
|
||||||
|
rootNode.attachChild(SkyFactory.createSky(assetManager, "Scenes/Beach/FullskiesSunset0068.dds", false));
|
||||||
|
}
|
||||||
|
DirectionalLight dl;
|
||||||
|
|
||||||
|
public void setupLighting() {
|
||||||
|
|
||||||
|
dl = new DirectionalLight();
|
||||||
|
dl.setDirection(lightDir);
|
||||||
|
dl.setColor(new ColorRGBA(.9f, .9f, .9f, 1));
|
||||||
|
rootNode.addLight(dl);
|
||||||
|
}
|
||||||
|
Material mat;
|
||||||
|
|
||||||
|
public void setupFloor() {
|
||||||
|
mat = assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWallPBR.j3m");
|
||||||
|
//mat = assetManager.loadMaterial("Textures/Terrain/BrickWall/BrickWallPBR2.j3m");
|
||||||
|
|
||||||
|
Node floorGeom = new Node("floorGeom");
|
||||||
|
Quad q = new Quad(100, 100);
|
||||||
|
q.scaleTextureCoordinates(new Vector2f(10, 10));
|
||||||
|
Geometry g = new Geometry("geom", q);
|
||||||
|
g.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X));
|
||||||
|
floorGeom.attachChild(g);
|
||||||
|
|
||||||
|
|
||||||
|
TangentBinormalGenerator.generate(floorGeom);
|
||||||
|
floorGeom.setLocalTranslation(-50, 22, 60);
|
||||||
|
//floorGeom.setLocalScale(100);
|
||||||
|
|
||||||
|
floorGeom.setMaterial(mat);
|
||||||
|
rootNode.attachChild(floorGeom);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupSignpost() {
|
||||||
|
Spatial signpost = assetManager.loadModel("Models/Sign Post/Sign Post.mesh.xml");
|
||||||
|
Material mat = assetManager.loadMaterial("Models/Sign Post/Sign Post.j3m");
|
||||||
|
TangentBinormalGenerator.generate(signpost);
|
||||||
|
signpost.setMaterial(mat);
|
||||||
|
signpost.rotate(0, FastMath.HALF_PI, 0);
|
||||||
|
signpost.setLocalTranslation(12, 23.5f, 30);
|
||||||
|
signpost.setLocalScale(4);
|
||||||
|
signpost.setShadowMode(ShadowMode.CastAndReceive);
|
||||||
|
rootNode.attachChild(signpost);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void simpleInitApp() {
|
||||||
|
cam.setLocation(new Vector3f(-15.445636f, 30.162927f, 60.252777f));
|
||||||
|
cam.setRotation(new Quaternion(0.05173137f, 0.92363626f, -0.13454558f, 0.35513034f));
|
||||||
|
flyCam.setMoveSpeed(30);
|
||||||
|
|
||||||
|
|
||||||
|
setupLighting();
|
||||||
|
setupSkyBox();
|
||||||
|
setupFloor();
|
||||||
|
setupSignpost();
|
||||||
|
|
||||||
|
inputManager.addListener(new AnalogListener() {
|
||||||
|
|
||||||
|
public void onAnalog(String name, float value, float tpf) {
|
||||||
|
if ("heightUP".equals(name)) {
|
||||||
|
parallaxHeigh += 0.01;
|
||||||
|
mat.setFloat("ParallaxHeight", parallaxHeigh);
|
||||||
|
}
|
||||||
|
if ("heightDown".equals(name)) {
|
||||||
|
parallaxHeigh -= 0.01;
|
||||||
|
parallaxHeigh = Math.max(parallaxHeigh, 0);
|
||||||
|
mat.setFloat("ParallaxHeight", parallaxHeigh);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}, "heightUP", "heightDown");
|
||||||
|
inputManager.addMapping("heightUP", new KeyTrigger(KeyInput.KEY_I));
|
||||||
|
inputManager.addMapping("heightDown", new KeyTrigger(KeyInput.KEY_K));
|
||||||
|
|
||||||
|
inputManager.addListener(new ActionListener() {
|
||||||
|
|
||||||
|
public void onAction(String name, boolean isPressed, float tpf) {
|
||||||
|
if (isPressed && "toggleSteep".equals(name)) {
|
||||||
|
steep = !steep;
|
||||||
|
mat.setBoolean("SteepParallax", steep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, "toggleSteep");
|
||||||
|
inputManager.addMapping("toggleSteep", new KeyTrigger(KeyInput.KEY_SPACE));
|
||||||
|
}
|
||||||
|
float parallaxHeigh = 0.05f;
|
||||||
|
float time = 0;
|
||||||
|
boolean steep = false;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void simpleUpdate(float tpf) {
|
||||||
|
// time+=tpf;
|
||||||
|
// lightDir.set(FastMath.sin(time), -1, FastMath.cos(time));
|
||||||
|
// bsr.setDirection(lightDir);
|
||||||
|
// dl.setDirection(lightDir);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
Material Pong Rock PBR : Common/MatDefs/Light/PBRLighting.j3md {
|
||||||
|
MaterialParameters {
|
||||||
|
Roughness : 1.0
|
||||||
|
Metallic : 0.0
|
||||||
|
BaseColorMap : Repeat Textures/Terrain/BrickWall/BrickWall.jpg
|
||||||
|
NormalMap : Repeat Textures/Terrain/BrickWall/BrickWall_normal_parallax.dds
|
||||||
|
PackedNormalParallax: true
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
Material Pong Rock PBR : Common/MatDefs/Light/PBRLighting.j3md {
|
||||||
|
MaterialParameters {
|
||||||
|
Roughness : 1.0
|
||||||
|
Metallic : 0.0
|
||||||
|
BaseColorMap : Repeat Textures/Terrain/BrickWall/BrickWall.jpg
|
||||||
|
ParallaxMap : Repeat Textures/Terrain/BrickWall/BrickWall_height.jpg
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user