Skip to content

Commit

Permalink
feat: transmission
Browse files Browse the repository at this point in the history
  • Loading branch information
hhhhkrx committed Dec 25, 2024
1 parent cf77ec4 commit 2764f86
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 71 deletions.
4 changes: 0 additions & 4 deletions packages/shader-shaderlab/src/shaders/PBR.gs
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,8 @@ Shader "PBR.gs" {
}

Header("Refraction"){
// material_AttenuationColor("AttenuationColor", Color ) = (1, 1, 1, 1);
// material_AttenuationDistance("AttenuationDistance", Range(0, 1, 0.01)) = 0;
material_Transmission("Transmission", Range(0, 1, 0.01)) = 0;
// material_Thickness("Thickness", Range(0, 5, 0.01)) = 0;
material_TransmissionTexture("TransmissionTexture", Texture2D);
// material_ThicknessTexture("ThicknessTexture", Texture2D);
}

Header("Common") {
Expand Down
26 changes: 3 additions & 23 deletions packages/shader-shaderlab/src/shaders/shadingPBR/BTDF.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,15 @@
sampler2D camera_OpaqueTexture;
vec3 evaluateRefraction(SurfaceData surfaceData, BRDFData brdfData) {
RefractionModelResult ray;
// #if REFRACTION_MODE == SPHERE
// refractionModelSphere(-surfaceData.viewDir, surfaceData.position, surfaceData.normal, surfaceData.IOR, surfaceData.thickness, ray);
// #elif REFRACTION_MODE == PLANE
// refractionModelBox(-surfaceData.viewDir, surfaceData.position, surfaceData.normal, surfaceData.IOR, surfaceData.thickness, ray);
// #elif REFRACTION_MODE == THIN
// refractionModelBox(-surfaceData.viewDir, surfaceData.position, surfaceData.normal, surfaceData.IOR, surfaceData.thickness, ray);
// #endif
#if REFRACTION_MODE == THIN
refractionModelBox(-surfaceData.viewDir, surfaceData.position, surfaceData.normal, surfaceData.IOR, surfaceData.thickness, ray);
#ifdef REFRACTION_MODE
refractionModelBox(-surfaceData.viewDir, surfaceData.position, surfaceData.normal, surfaceData.IOR, 0.005, ray);
#endif
//TODO: support cubemap refraction.
vec3 refractedRayExit = ray.positionExit;

// We calculate the screen space position of the refracted point
vec4 samplingPositionNDC = camera_ProjMat * camera_ViewMat * vec4( refractedRayExit, 1.0 );
vec2 refractionCoords = (samplingPositpbionNDC.xy / samplingPositionNDC.w) * 0.5 + 0.5;

// Absorption coefficient from Disney: http://blog.selfshadow.com/publications/s2015-shading-course/burley/s2015_pbs_disney_bsdf_notes.pdf
// #ifdef MATERIAL_HAS_ABSORPTION
// #ifdef MATERIAL_HAS_THICKNESS
// vec3 transmittance = min(vec3(1.0), exp(-surfaceData.absorptionCoefficient * ray.transmissionLength));
// #else
// vec3 transmittance = 1.0 - surfaceData.absorptionCoefficient;
// #endif
// #endif
vec2 refractionCoords = (samplingPositionNDC.xy / samplingPositionNDC.w) * 0.5 + 0.5;

// Sample the opaque texture to get the transmitted light
vec4 getTransmission = texture2D(camera_OpaqueTexture, refractionCoords);
Expand All @@ -43,10 +27,6 @@
vec3 specularDFG = brdfData.specularDFG;

refractionTransmitted *= (1.0 - specularDFG);

// #ifdef MATERIAL_HAS_ABSORPTION
// refractionTransmitted *= transmittance;
// #endif

return refractionTransmitted;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,23 +62,13 @@ float material_OcclusionTextureCoord;
#endif
#endif

#ifdef MATERIAL_ENABLE_SS_REFRACTION
// vec3 material_AttenuationColor;
// float material_AttenuationDistance;

#ifdef MATERIAL_ENABLE_SS_REFRACTION
#ifdef MATERIAL_HAS_TRANSMISSION
float material_Transmission;
#ifdef MATERIAL_HAS_TRANSMISSION_TEXTURE
sampler2D material_TransmissionTexture;
#endif
#endif

// #ifdef MATERIAL_HAS_THICKNESS
// float material_Thickness;
// #ifdef MATERIAL_HAS_THICKNESS_TEXTURE
// sampler2D material_ThicknessTexture;
// #endif
// #endif
#endif

// Texture
Expand Down Expand Up @@ -314,7 +304,6 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){
#endif

#ifdef MATERIAL_ENABLE_SS_REFRACTION
// surfaceData.absorptionCoefficient = -log(material_AttenuationColor + HALF_EPS) / max(HALF_EPS, material_AttenuationDistance);
#ifdef MATERIAL_HAS_TRANSMISSION
surfaceData.transmission = material_Transmission;
#ifdef MATERIAL_HAS_TRANSMISSION_TEXTURE
Expand All @@ -324,17 +313,6 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){
surfaceData.transmission = 1.0;
#endif

// #ifdef MATERIAL_HAS_THICKNESS
// #if REFRACTION_MODE == THIN
// //https://zh.wikipedia.org/wiki/%E8%96%84%E8%86%9C%E5%85%89%E5%AD%A6
// surfaceData.thickness = 0.005;
// #else
// surfaceData.thickness = max(material_Thickness, 0.0001);
// #ifdef MATERIAL_HAS_THICKNESS_TEXTURE
// surfaceData.thickness *= texture2D( material_ThicknessTexture, uv).g;
// #endif
// #endif
// #endif
#endif

// AO
Expand Down
21 changes: 0 additions & 21 deletions packages/shader-shaderlab/src/shaders/shadingPBR/Refraction.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,6 @@ struct RefractionModelResult{
// vec3 directionExit; // out ray direction
};

//https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@15.0/manual/refraction-models.html
// void refractionModelSphere(vec3 V, vec3 positionWS, vec3 normalWS, float ior, float thickness, out refractionModelResult ray){
// // Refracted ray
// vec3 R1 = refract(V, normalWS, 1.0 / ior);
// // Center of the tangent sphere
// vec3 C = positionWS - normalWS * thickness * 0.5;

// // Second refraction (tangent sphere out)
// float dist = dot(-normalWS, R1) * thickness;
// // Out hit point in the tangent sphere
// vec3 P1 = positionWS + R1 * dist;
// // Out normal
// vec3 N1 = safeNormalize(C - P1);
// // Out refracted ray
// // vec3 R2 = refract(R1, N1, ior);

// ray.transmissionLength = dist;
// ray.positionExit = P1;
// // ray.directionExit = R2;
// }

void refractionModelBox(vec3 V, vec3 positionWS, vec3 normalWS, float ior, float thickness, out RefractionModelResult ray){
// Refracted ray
vec3 R = refract(V, normalWS, 1.0 / ior);
Expand Down

0 comments on commit 2764f86

Please sign in to comment.