*
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
struct VS_INPUT {
|
||||
float4 vPosition : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
float2 uv0 : UV0;
|
||||
float2 uv1 : UV1;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 vPosition : SV_POSITION;
|
||||
float3 normal : TEXCOORD0;
|
||||
float2 uv0 : TEXCOORD1;
|
||||
float2 uv1 : TEXCOORD2;
|
||||
float3 worldPos : TEXCOORD3;
|
||||
};
|
||||
|
||||
cbuffer TestBuffer : register(b3) {
|
||||
float4x4 mWorld;
|
||||
float4x4 mView;
|
||||
float4x4 mProjection;
|
||||
float4 cameraWorldPos;
|
||||
}
|
||||
|
||||
Texture2D diffuse : register(t0);
|
||||
Texture2D tex2 : register(t1);
|
||||
SamplerState MeshTextureSampler;
|
||||
|
||||
|
||||
|
||||
VS_OUTPUT main_vs(VS_INPUT v) {
|
||||
VS_OUTPUT o;
|
||||
|
||||
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
||||
|
||||
o.vPosition = mul(wvp, float4(v.vPosition.xyz, 1));
|
||||
|
||||
o.normal = mul((float3x3)mWorld, v.normal);
|
||||
o.uv0 = v.uv0;
|
||||
o.uv1 = v.uv1;
|
||||
o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz);
|
||||
return o;
|
||||
}
|
||||
|
||||
#include "lighting/cook_torrance_term.inc"
|
||||
|
||||
float4 main_ps(VS_OUTPUT input) : SV_Target
|
||||
{
|
||||
float3 ambient = float3(0.3f, 0.3f, 0.4f);
|
||||
|
||||
float4 diffuseColor = 1.0f;// diffuse.Sample(MeshTextureSampler, input.uv0);
|
||||
float3 worldPos = input.worldPos;
|
||||
float3 camPos = cameraWorldPos.xyz;
|
||||
float3 viewDir = normalize(camPos - worldPos);
|
||||
float3 sun = normalize(float3(-1, 1, -1));
|
||||
|
||||
float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.1f, 1.0f, float3(1,1,1), diffuseColor.rgb);
|
||||
return float4(surfaceColor + ambient * diffuseColor, 1);
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 vPosition : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
float2 uv0 : UV0;
|
||||
float2 uv1 : UV1;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 vPosition : SV_POSITION;
|
||||
float3 normal : TEXCOORD0;
|
||||
float2 uv0 : TEXCOORD1;
|
||||
float2 uv1 : TEXCOORD2;
|
||||
float3 worldPos : TEXCOORD3;
|
||||
float3 viewPos : TEXCOORD4;
|
||||
};
|
||||
|
||||
cbuffer TestBuffer : register(b3) {
|
||||
float4x4 mWorld;
|
||||
float4x4 mView;
|
||||
float4x4 mProjection;
|
||||
float4 cameraWorldPos;
|
||||
float4 _DiffuseColor;
|
||||
}
|
||||
|
||||
Texture2D diffuse : register(t0);
|
||||
Texture2D tex2 : register(t1);
|
||||
SamplerState MeshTextureSampler;
|
||||
|
||||
|
||||
|
||||
VS_OUTPUT main_vs(VS_INPUT v){
|
||||
VS_OUTPUT o;
|
||||
|
||||
|
||||
float4x4 wv = mul(mView, mWorld);
|
||||
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
||||
|
||||
o.vPosition = mul(wvp, float4(v.vPosition.xyz,1));
|
||||
|
||||
o.normal = mul((float3x3)mWorld, v.normal);
|
||||
o.uv0 = v.uv0;
|
||||
o.uv1 = v.uv1;
|
||||
o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz);
|
||||
o.viewPos = mul(wv, float4(v.vPosition.xyz, 1));
|
||||
return o;
|
||||
}
|
||||
|
||||
#include "lighting/cook_torrance_term.inc"
|
||||
|
||||
float4 main_ps(VS_OUTPUT input) : SV_Target
|
||||
{
|
||||
float3 ambient = float3(0.3f, 0.3f, 0.4f);
|
||||
|
||||
float4 diffuseColor = _DiffuseColor * diffuse.Sample(MeshTextureSampler, input.uv0);
|
||||
float3 worldPos = input.worldPos;
|
||||
float3 camPos = cameraWorldPos.xyz;
|
||||
float3 viewDir = normalize(camPos - worldPos);
|
||||
float3 sun = normalize(float3(-1, 1, -1));
|
||||
|
||||
float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.7f, 0.1f, diffuseColor.rgb, diffuseColor.rgb);
|
||||
|
||||
return float4(surfaceColor + ambient * diffuseColor, 1);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 position : POSITION;
|
||||
float4 color : COLOR;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 position : SV_POSITION;
|
||||
float4 color : TEXCOORD0;
|
||||
};
|
||||
|
||||
cbuffer TestBuffer : register(b3) {
|
||||
float4x4 mWorld;
|
||||
float4x4 mView;
|
||||
float4x4 mProjection;
|
||||
float alphaMul;
|
||||
}
|
||||
|
||||
VS_OUTPUT main_vs(VS_INPUT v) {
|
||||
VS_OUTPUT o;
|
||||
|
||||
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
||||
o.position = mul(wvp, float4(v.position.xyz, 1));
|
||||
o.color = v.color;
|
||||
return o;
|
||||
}
|
||||
|
||||
float4 main_ps(VS_OUTPUT input) : SV_Target{
|
||||
float4 color = input.color;
|
||||
color *= alphaMul;
|
||||
return color;
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
#ifndef COOK_TORRANCE_TERM
|
||||
#define COOK_TORRANCE_TERM
|
||||
|
||||
float4 cook_torrance(
|
||||
in float3 normal,
|
||||
in float3 viewer,
|
||||
in float3 light, float roughness_value, float ref_at_norm_incidence, float3 cSpecular, float3 cDiffuse)
|
||||
{
|
||||
// Compute any aliases and intermediary values
|
||||
// -------------------------------------------
|
||||
float3 half_vector = normalize( light + viewer );
|
||||
float NdotL = saturate( dot( normal, light ) );
|
||||
float NdotH = max( dot( normal, half_vector ) , 1.0e-7);
|
||||
float NdotV = saturate( dot( normal, viewer ) );
|
||||
float VdotH = saturate( dot( viewer, half_vector ) );
|
||||
float r_sq = roughness_value * roughness_value;
|
||||
|
||||
|
||||
|
||||
// Evaluate the geometric term
|
||||
// --------------------------------
|
||||
float geo_numerator = 2.0f * NdotH;
|
||||
float geo_denominator = VdotH;
|
||||
|
||||
float geo_b = (geo_numerator * NdotV ) / geo_denominator;
|
||||
float geo_c = (geo_numerator * NdotL ) / geo_denominator;
|
||||
float geo = min( 1.0f, min( geo_b, geo_c ) );
|
||||
|
||||
|
||||
|
||||
// Now evaluate the roughness term
|
||||
// -------------------------------
|
||||
float roughness;
|
||||
float roughness_a = 1.0f / ( 4.0f * r_sq * pow( NdotH, 4 ) );
|
||||
float roughness_b = NdotH * NdotH - 1.0f;
|
||||
float roughness_c = r_sq * NdotH * NdotH;
|
||||
roughness = roughness_a * exp( roughness_b / roughness_c );
|
||||
|
||||
|
||||
// Next evaluate the Fresnel value
|
||||
// -------------------------------
|
||||
float fresnel = pow( 1.0f - VdotH, 5.0f );
|
||||
fresnel *= ( 1.0f - ref_at_norm_incidence );
|
||||
fresnel += ref_at_norm_incidence;
|
||||
|
||||
|
||||
|
||||
// Put all the terms together to compute
|
||||
// the specular term in the equation
|
||||
// -------------------------------------
|
||||
float3 Rs_numerator = ( fresnel * geo * roughness );
|
||||
float Rs_denominator = max(1.0e-7, NdotV * NdotL);
|
||||
float3 Rs = Rs_numerator/ Rs_denominator;
|
||||
|
||||
|
||||
|
||||
// Put all the parts together to generate
|
||||
// the final colour
|
||||
// --------------------------------------
|
||||
|
||||
|
||||
Rs = max(0, Rs);
|
||||
float3 final = max(0.0f, NdotL) *cDiffuse + (1 * Rs );
|
||||
|
||||
// Return the result
|
||||
// -----------------
|
||||
return float4( final, 1.0f );
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,47 @@
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 vPosition : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
float2 uv0 : UV0;
|
||||
float2 uv1 : UV1;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 vPosition : SV_POSITION;
|
||||
float3 normal : TEXCOORD0;
|
||||
float2 uv0 : TEXCOORD1;
|
||||
float2 uv1 : TEXCOORD2;
|
||||
};
|
||||
|
||||
cbuffer TestBuffer : register(b3) {
|
||||
float4x4 mWorld;
|
||||
float4x4 mView;
|
||||
float4x4 mProjection;
|
||||
}
|
||||
|
||||
Texture2D tex : register(t0);
|
||||
Texture2D tex2 : register(t1);
|
||||
SamplerState MeshTextureSampler;
|
||||
|
||||
VS_OUTPUT main_vs(VS_INPUT v) {
|
||||
VS_OUTPUT o;
|
||||
|
||||
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
||||
|
||||
o.vPosition = mul(wvp, float4(v.vPosition.xyz, 1));
|
||||
|
||||
o.normal = mul((float3x3)mWorld, v.normal);
|
||||
o.uv0 = v.uv0;
|
||||
o.uv1 = v.uv1;
|
||||
return o;
|
||||
}
|
||||
|
||||
|
||||
float4 main_ps(VS_OUTPUT input) : SV_Target
|
||||
{
|
||||
float3 sun = normalize(float3(-1,1,-1));
|
||||
float lit = dot(sun, input.normal);
|
||||
float3 diffuse = float3(1, 0, 0);
|
||||
|
||||
return float4(diffuse * lit, 1);
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 vPosition : POSITION;
|
||||
float3 normal : NORMAL;
|
||||
float2 uv0 : UV0;
|
||||
float2 uv1 : UV1;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 vPosition : SV_POSITION;
|
||||
float3 normal : TEXCOORD0;
|
||||
float2 uv0 : TEXCOORD1;
|
||||
float2 uv1 : TEXCOORD2;
|
||||
float3 worldPos : TEXCOORD3;
|
||||
float3 viewPos : TEXCOORD4;
|
||||
};
|
||||
|
||||
cbuffer TestBuffer : register(b3) {
|
||||
float4x4 mWorld;
|
||||
float4x4 mView;
|
||||
float4x4 mProjection;
|
||||
float4 cameraWorldPos;
|
||||
}
|
||||
|
||||
Texture2D diffuse : register(t0);
|
||||
SamplerState MeshTextureSampler : register(s0);
|
||||
|
||||
|
||||
|
||||
VS_OUTPUT main_vs(VS_INPUT v){
|
||||
VS_OUTPUT o;
|
||||
float4x4 wv = mul(mView, mWorld);
|
||||
float4x4 wvp = mul(mul(mProjection, mView), mWorld);
|
||||
|
||||
o.vPosition = mul(wvp, float4(v.vPosition.xyz,1));
|
||||
o.normal = mul((float3x3)mWorld, v.normal);
|
||||
o.uv0 = v.uv0;
|
||||
o.uv1 = v.uv1;
|
||||
o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz);
|
||||
o.viewPos = mul(wv, float4(v.vPosition.xyz, 1));
|
||||
return o;
|
||||
}
|
||||
|
||||
#include "lighting/cook_torrance_term.inc"
|
||||
|
||||
float4 main_ps(VS_OUTPUT input) : SV_Target
|
||||
{
|
||||
float3 ambient = float3(0.3f, 0.3f, 0.4f);
|
||||
|
||||
float4 diffuseColor = diffuse.Sample(MeshTextureSampler, input.uv0);
|
||||
return diffuseColor;
|
||||
float3 worldPos = input.worldPos;
|
||||
float3 camPos = cameraWorldPos.xyz;
|
||||
float3 viewDir = normalize(camPos - worldPos);
|
||||
float3 sun = normalize(float3(-1, 1, -1));
|
||||
|
||||
float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.7f, 0.1f, diffuseColor.rgb, diffuseColor.rgb);
|
||||
|
||||
return float4(surfaceColor + ambient * diffuseColor, 1);
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
#pragma shader_language HLSL
|
||||
|
||||
#include <Shaders/test0.hlsl>
|
||||
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 inPosition : POSITION;
|
||||
float3 inColor : NORMAL;
|
||||
float2 uv0 : UV0;
|
||||
float2 uv1 : UV1;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT {
|
||||
float4 vPosition : SV_POSITION;
|
||||
float3 color;
|
||||
};
|
||||
|
||||
|
||||
#ifdef SHADER_STAGE_VERTEX
|
||||
cbuffer CameraData : register(b0, space0) {
|
||||
float4x4 view;
|
||||
float4x4 proj;
|
||||
float4x4 viewproj;
|
||||
}
|
||||
|
||||
|
||||
struct Test {
|
||||
float3 getColor() {
|
||||
return float3(1,0,0);
|
||||
}
|
||||
};
|
||||
|
||||
VS_OUTPUT main(VS_INPUT v, uint VertexIndex : SV_VertexID) {
|
||||
VS_OUTPUT o;
|
||||
Test t;
|
||||
float4x4 vp = mul(view, proj);
|
||||
o.vPosition = mul(float4(v.inPosition.xyz, 1), vp);
|
||||
o.color = v.inColor;
|
||||
return o;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef SHADER_STAGE_FRAGMENT
|
||||
float4 main(VS_OUTPUT input) : SV_Target
|
||||
{
|
||||
return float4(input.color, 1.0f);
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user