আমি কীভাবে wetক্যে "ভেজা পৃষ্ঠ" / "অগভীর পুকুর" শেডার তৈরি করতে পারি?


71

আমার গেমটিতে আমার গতিশীল জলের পুডস তৈরি করতে হবে তবে আমি এমন একটি টিউটোরিয়াল খুঁজে পাচ্ছি না যাতে আমি বোঝাতে পারি যে আমি কীভাবে এমন প্রভাব ফেলতে পারি (যার উদাহরণ নীচে দেখানো হয়েছে)। আমি এটা কিভাবে করবো?

কোয়ান্টাম বিরতি


4
এ জাতীয় উচ্চ ভোটের প্রশ্ন এবং উচ্চতর ভোটিত উত্তর বন্ধ না হয়ে দেখে বিরক্তিকর। নিজের উত্তরটি সবচেয়ে ভাল হিসাবে বেছে নেওয়া ভাল, যদিও নিজের জন্য অনুগ্রহ দাবি করার জন্য কিছুটা নির্বোধ :)
টিম হল্ট

@ টিমহোল্ট কোন ভিত্তিতে আমরা যদিও এইরকম একটি প্রশ্ন বন্ধ করব? এটি পুরোপুরি অনন্য বিষয় বলে মনে হচ্ছে।
জোশ

আমি বলছি যে যে এটি জিজ্ঞাসা করেছে তার নিজের উত্তর গ্রহণ করা উচিত। আমার ইংরাজির অপব্যবহার ক্ষমা করুন।
টিম হল্ট

উত্তর:


121

প্রতিফলন

ভিজে শেডার তৈরি করতে আপনার প্রথমে প্রতিবিম্ব হওয়া দরকার।

SimpleRoad

আপনি একটি প্রতিবিম্ব পরীক্ষা বা একটি মিরররফ্লেশন 3 ব্যবহার করতে পারেন তবে, আমি এখানে একটি জাল প্রতিবিম্ব (ঘনক মানচিত্র) ব্যবহার করি কারণ শেডারটি তখন মোবাইলে ব্যবহার করা যায়।

প্রতিফলন

Shader "Smkgames/TransparentCubeMap" {
Properties {
_Color("Color",Color) = (1,1,1,1)
_Cube ("Cubemap", CUBE) = "" {}
_Metallic("Metallic",Range(0,1)) = 1
_Smoothness("Smoothness",Range(0,1)) = 1
_Alpha("Alpha",Range(0,1)) = 1
}
SubShader {
Tags {"RenderType"="Transparent" "Queue"="Transparent"}
LOD 200
Pass {
ColorMask 0
}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB

CGPROGRAM
#pragma surface surf Standard fullforwardshadows alpha:fade

struct Input {
float2 uv_MainTex;
float3 worldRefl;
};
sampler2D _MainTex;
samplerCUBE _Cube;
float4 _Color;
float _Metallic;
float _Smoothness;
float4 _EmissionColor;
float _Alpha;
void surf (Input IN, inout SurfaceOutputStandard o) {
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;

o.Albedo = c.rgb * 0.5 * _Color;
o.Emission = texCUBE (_Cube, IN.worldRefl).rgb*_Color;
o.Metallic = _Metallic;
o.Smoothness = _Smoothness;
o.Alpha = _Alpha;

}
ENDCG
} 
Fallback "Diffuse"
}

নড়ন

আপনার প্রতিবিম্বে বিকৃতি যোগ করতে, আপনি সাধারণ মানচিত্র এবং এর গুণন করতে পারেন worldRefl:

float3 distortion = tex2D(_Distortion, IN.uv_Distortion);
o.Emission = texCUBE(_Cube, IN.worldRefl*distortion).rgb

নড়ন

প্রক্রিয়াজাতীয় আকার

পদ্ধতিগত আকার তৈরি করতে আপনি শব্দটি ব্যবহার করতে পারেন :

গ্রেপ্তার

এখানে একটি ফ্র্যাক্টাল ব্রাউনিয়ান মোশন (এফবিএম) টিউটোরিয়াল

Shader "Smkgames/FbmNoise"
{
Properties
{
_TileAndOffset("Tile and Offset",Vector) = (1,1,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};


float4 _TileAndOffset;
float _Step,_Min,_Ma;

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv*_TileAndOffset.xy+_TileAndOffset.zw;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}

// Author @patriciogv - 2015
// http://patriciogonzalezvivo.com

float random (in float2 st) {
return frac(sin(dot(st.xy,
                    float2(12.9898,78.233)))*
    43758.5453123);
}

// Based on Morgan McGuire @morgan3d
// https://www.shadertoy.com/view/4dS3Wd
float noise (in float2 st) {
float2 i = floor(st);
float2 f = frac(st);

// Four corners in 2D of a tile
float a = random(i);
float b = random(i + float2(1.0, 0.0));
float c = random(i + float2(0.0, 1.0));
float d = random(i + float2(1.0, 1.0));

float2 u = f * f * (3.0 - 2.0 * f);

return lerp(a, b, u.x) +
        (c - a)* u.y * (1.0 - u.x) +
        (d - b) * u.x * u.y;
}

#define OCTAVES 6
float fbm (in float2 st) {
// Initial values
float value = 0.0;
float amplitude = .5;
float frequency = 0.;
//
// Loop of octaves
for (int i = 0; i < OCTAVES; i++) {
    value += amplitude * noise(st);
    st *= 2.;
    amplitude *= .5;
}
return value;
}

        fixed4 frag (v2f i) : SV_Target
        {


float2 st =i.uv;

float3 color = float3(0,0,0);
color += fbm(st*3.0);
return float4(color,1.0);

        }
ENDCG
}
}
}

উপরের এফবিএমটি সরাসরি আপনার শেডারে ব্যবহার করা উচিত নয় কারণ এতে অনেকগুলি জিপিইউ গণনা রয়েছে এবং কর্মক্ষমতা হ্রাস পায়। সরাসরি ব্যবহারের পরিবর্তে, আপনি ফলাফলটি রেন্ডার টেক্সচার সহ কোনও টেক্সচারে রেন্ডার করতে পারেন ।

শেদার্টোয় একাধিক পাস ব্যবহার করেন , প্রতি "বাফার" এর জন্য একটি। নামটি ইঙ্গিত দেয়, এই পাসটি ফলাফলগুলিকে একটি বাফারে সংরক্ষণ করে, যা কেবল একটি টেক্সচার। Ityক্য আপনাকে টেক্সচারগুলিকেও রেন্ডার করতে দেয়।

2018-01-26_10-18-20

মুখোশ তৈরি করা হচ্ছে

আপনি এই ফাংশনগুলি দিয়ে একটি ঘন এবং মসৃণ মাস্ক তৈরি করতে পারেন:

ধাপ

ধাপ

আউটপুট 1 এর [A]চেয়ে কম বা সমান [B]হলে অন্যথায় 0 আউটপুট হয়।

Smoothstep

smoothstep

তৃতীয় মান যেখানে এই ব্যাপ্তিতে থাকে তার ভিত্তিতে দুটি মানের মধ্যে সহজেই মিশ্রিত হয় 0 এবং 1 এর মধ্যে আউটপুট মানগুলি it

ফলাফল

/* Warning: don't use this shader because this is for preview only.
It has many GPU calculations so if you want use this in your game you should 
remove the FBM noise functions or render it to texture, or you can use an FBM texture
*/
//Created By Seyed Morteza Kamaly
Shader "Smkgames/WetShader" {
Properties{
_MainTex("MainTex",2D) = "white"{}
_Distortion("Distortion",2D) = "bump"{}
_Cube("Cubemap", CUBE) = "" {}
_BumpMap("Bumpmap", 2D) = "bump" {}
_Metallic("Metallic",Range(0,1)) = 0
_Smoothness("Smoothness",Range(0,1)) = 1
_ReflectAlpha("ReflectAlpha",Range(0,1)) = 1
scaleX("UV.X scale",Float) = 10.0
scaleY("UV.Y scale",Float) = 10.0
_Smooth("Smooth",Float) = 0.4
_Intensity("Intensity",Float) = 1
}
SubShader{
Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
LOD 200
Pass{
ColorMask 0
}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB

CGPROGRAM
#pragma surface surf Standard fullforwardshadows alpha:fade

struct Input {
float2 uv_MainTex;
float2 uv_Distortion;
float3 worldRefl;
float2 uv_BumpMap;
INTERNAL_DATA
};
sampler2D _MainTex, _Distortion;
samplerCUBE _Cube;
float _Metallic,_Smoothness;
float4 _EmissionColor;
sampler2D _NormalMap;
uniform fixed scaleX, scaleY, _Smooth, _Intensity,_Alpha,_ReflectAlpha;

static const float2x2 m = float2x2(-0.5, 0.8, 1.7, 0.2);

float hash(float2 n)
{
return frac(sin(dot(n, float2(95.43583, 93.323197))) * 65536.32);
}

float noise(float2 p)
{
float2 i = floor(p);
float2 u = frac(p);
u = u*u*(3.0 - 2.0*u);
float2 d = float2 (1.0, 0.0);
float r = lerp(lerp(hash(i), hash(i + d.xy), u.x), lerp(hash(i + d.yx), hash(i + d.xx), u.x), u.y);
return r*r;
}

float fbm(float2 p)
{
float f = 0.0;
f += 0.500000*(0.5 + 0.5*noise(p));
return f;
}

float fbm2(float2 p)
{
float f = 0.0;
f += 0.500000*(0.6 + 0.45*noise(p)); p = p*2.02; p = mul(p, m);
f += 0.250000*(0.6 + 0.36*noise(p));
return f;
}


void surf(Input IN, inout SurfaceOutputStandard o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);

o.Metallic = _Metallic;
o.Smoothness = _Smoothness;
o.Alpha = 1;

float t = fbm2(float2(IN.uv_MainTex.x*scaleX, IN.uv_MainTex.y*scaleY));

float fbmMask = step(t, _Smooth)*_Intensity;
float3 distortion = tex2D(_Distortion, IN.uv_Distortion);
o.Emission = texCUBE(_Cube, IN.worldRefl*distortion).rgb*_ReflectAlpha*fbmMask;

o.Albedo = float4(1.0, 1.0, 1.0, 1.0)*tex2Dlod(_MainTex, float4(IN.uv_MainTex, 0.0, 0.0));


}
ENDCG
}
Fallback "Diffuse"
}

ভাবমূর্তি

মানচিত্র ব্যবহার করা হচ্ছে

shaderToy শারীরিক ভিত্তিক ছায়া গো

এখানে একটি দরকারী সংজ্ঞা রয়েছে:

বন্ধুরতা বস্তুর microsurface বর্ণনা করে। সাদা 1.0 রুক্ষ এবং কালো 0.0 মসৃণ। মাইক্রোসার্ফেসটি যদি রুক্ষ হয় তবে হালকা রশ্মিকে ছড়িয়ে দিতে পারে এবং হাইলাইটটি ম্লান এবং আরও বিস্তৃত দেখাতে পারে। একই পরিমাণ হালকা শক্তি ভূপৃষ্ঠে আসার সাথে সাথে বাইরে বের হওয়া প্রতিফলিত হয়। এই মানচিত্রে সর্বাধিক শৈল্পিক স্বাধীনতা রয়েছে। এখানে কোনও ভুল উত্তর নেই। এই মানচিত্রটি সম্পত্তিকে সর্বাধিক চরিত্র দেয় কারণ এটি সত্যই পৃষ্ঠের বর্ণনা দেয় যেমন স্ক্র্যাচস, ফিঙ্গারপ্রিন্টস, স্মুডস, গ্রিম ইত্যাদি describes

চকচকে এই মানচিত্রটি রুক্ষতার মানচিত্রের বিপরীত। সাদা ১.০ মসৃণ এবং ০.০ কালো রুক্ষ। অবজেক্টের মাইক্রোসার্ফেস বর্ণনা করে। মাইক্রোসার্ফেসটি যদি রুক্ষ হয় তবে হালকা রশ্মিকে ছড়িয়ে দিতে পারে এবং হাইলাইটটি ম্লান এবং আরও বিস্তৃত দেখাতে পারে। একই পরিমাণ হালকা শক্তি ভূপৃষ্ঠে আসার সাথে সাথে প্রতিফলিত হয়। এই মানচিত্রে সর্বাধিক শৈল্পিক স্বাধীনতা রয়েছে। এখানে কোনও ভুল উত্তর নেই। এই মানচিত্রটি সম্পদকে সর্বাধিক চরিত্র দেয় কারণ এটি সত্যই পৃষ্ঠের বর্ণনা দেয় যেমন স্ক্র্যাচস, ফিঙ্গারপ্রিন্টস, স্মুডস, গ্রিম ইত্যাদি describes

সূচক এই মানচিত্রে ধাতব এবং ডাইলেট্রিকটিক্স (অ ধাতু) উভয় পৃষ্ঠের জন্য প্রতিবিম্ব তথ্য রয়েছে। এটি ধাতব / রুক্ষ এবং স্পেস / গ্লস কর্মপ্রবাহের মূল পার্থক্য। একই বিধি প্রযোজ্য। ধাতবগুলির জন্য আপনাকে মাপা মানগুলি ব্যবহার করতে হবে এবং সর্বাধিক সমস্ত ডাইলেট্রিকগুলি 0.04 - 4% পরিসীমা সহ পড়ে যাবে। যদি ধাতুতে ময়লা থাকে তবে প্রতিবিম্বের মানটিও হ্রাস করা প্রয়োজন। যাইহোক, আপনি ডাইলেেক্ট্রিক উপকরণগুলির জন্য নির্দিষ্ট ম্যাপে বিভিন্ন মান যুক্ত করতে পারেন যেহেতু মানচিত্রটি লেখার আপনার নিয়ন্ত্রণ রয়েছে।

https://forum.allegorithmic.com/index.php?topic=3243.0

বন্ধুরতা

ভাবমূর্তি

কেন জানি না, তবে ইউনিটির স্ট্যান্ডার্ড শেডারটির মসৃণতা মানচিত্র নেই, তাই আমি একটি বেসিক শেডার লিখে এই মানচিত্রটি যুক্ত করেছি।

Shader "Smkgames/SimpleSurface" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _GlossMap("GlossMap",2D) = "white"{}
        _Glossiness ("Smoothness", Float) = 1.5
        _Metallic ("Metallic", Float) = 0.5
        _MetallicMap("MetallicMap",2D) = "white"{}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness,_Metallic;
        fixed4 _Color;
        sampler2D _GlossMap,_MetallicMap;

        UNITY_INSTANCING_CBUFFER_START(Props)
        UNITY_INSTANCING_CBUFFER_END

        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Metallic = _Metallic*tex2D(_MetallicMap,IN.uv_MainTex);
            o.Smoothness = _Glossiness*tex2D(_GlossMap,IN.uv_MainTex);
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

আমি মনে করি Unক্যের রুক্ষতা নেই, এটিতে কেবল ধাতব রয়েছে, তবে আলফা চ্যানেলটি রুক্ষতার জন্য এবং লাল চ্যানেল ধাতব জন্য। আপনি মসৃণতা সঙ্গে তীব্রতা পরিবর্তন করতে পারেন।

গিটহাবের উত্স

দরকারী লিংক

কাদা-গোলক-1024x576

https://80.lv/articles/how-to-create-wet-mud-in-substance-designer/

https://www.fxguide.com/featured/game-environments-partc/


39
বাহ, আপনি প্রশ্নোত্তর সাইটে পুরো শেডার টিউটোরিয়াল সিরিজটি করেছেন।
ওসেলোট

6
@ ওসেলোট আমি পছন্দ করি যে এখানে সৈয়দ কীভাবে আরও বেশি করে যোগ করে চলেছে। আমি শেডারের সাথে টিঙ্কারিং পছন্দ করি এবং এটি আরও ধারণাগুলির জন্য এবং টিউটোরিয়াল হিসাবেও সত্যই সহায়ক। তিনি আমার মতে চিরকাল এগুলি পোস্ট করতে পারেন।
জন হ্যামিল্টন

7
আশ্চর্যজনক উত্তর। শেডারগুলির সাথে কাজ করা খুব কঠিন এবং এটি আমার পছন্দসই প্রভাবগুলি পেতে আমাকে ঘনঘন, গবেষণা, পরীক্ষা এবং ত্রুটি এবং অন্যান্য শেডারগুলির পরীক্ষার সময় নেয়। এবং এখানে আপনি নিখরচায় অন্য কারও জন্য এটি করছেন।
ড্রাকো 18

1
স্ট্যান্ডার্ড উপাদানগুলির জন্য ধাতব বা স্বাভাবিক মানচিত্রে রুক্ষতা এম্বেড করা ভাল (পূর্বেটিকে ডিফল্ট বলে মনে হয়)। আমি ফটো শপ, পেইন্ট শপ বা জিম্প ব্যবহার করার প্রস্তাব করব যাতে কোনও যথাযথ ধাতব তৈরি হয় যা রুক্ষতা এম্বেড করে। বিকল্পভাবে যদি আপনার সাবস্ট্যান্স পেইন্টার বা এর মতো থাকে তবে আপনি নিজের রুক্ষতা ঠিক সেইভাবেই রপ্তানি করতে পারবেন যেভাবে ইউনিটি তাদের ইচ্ছা করে এবং আপনার উপাদানগুলিকে ityক্যে রাখার আগে সেগুলি দৃশ্যধারণ করার সুবিধা পেতে পারে।
ডেভিড পিটারসন

একজন পণ্ডিত এবং এক ভদ্রলোক
বাস স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.