【OpenGL】Shader技巧集合
这篇文章将收集unity中使用shader的相关技巧和特效,会不断地更新内容。关于在Unity中使用shader的介绍,请参考《【OpenGL】使用Unity来学习OpenGL》 常用的内置uniform iResolution =》_ScreenParams iGlobalTime = _Time.y glFragCoord = f loat4 sp:WPOS
这篇文章将收集unity中使用shader的相关技巧和特效,会不断地更新内容。关于在Unity中使用shader的介绍,请参考《【OpenGL】使用Unity来学习OpenGL》
常用的内置uniform
iResolution =》_ScreenParams
iGlobalTime => _Time.y
glFragCoord => float4 sp:WPOS // 需要 #pragma target 3.0, 另外的方式请见下面
vec2 => float2
mix => lerp
mod => fmod
texture2D => tex2D
textureCube => texCUBE
mat2=>float2x2
fract=>frac
========
关于glFragCoord, 可以使用另外一种方式计算(支持3.0之前的)参考官方例子
o.scrPos = ComputeScreenPos(o.pos);
float2 wcoord = (i.scrPos.xy/i.scrPos.w);
-------
float2 wcoord = sp.xy/_ScreenParams.xy;
关于数学的Shader:https://www.shadertoy.com/view/ldlSD2 https://www.shadertoy.com/view/ldlSWj
很好的一个教程:http://ogldev.atspace.co.uk/index.html
Deferred Shading 原理: http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html
关于Stencil Buffer 的理解:http://www.cnblogs.com/mikewolf2002/archive/2012/05/15/2500867.html
更多文章:1)http://docs.unity3d.com/Manual/SL-Stencil.html
2) http://answers.unity3d.com/questions/590800/how-to-cullrender-to-through-a-window.html
Stencil Shadow Volume : http://ogldev.atspace.co.uk/www/tutorial40/tutorial40.html
http://en.wikipedia.org/wiki/Shadow_volume
镜面反射的实现原理:
ftp://ftp.sgi.com/sgi/opengl/contrib/blythe/advanced99/notes/node158.html
其它镜面反射:
http://en.wikibooks.org/wiki/Cg_Programming/Unity/Mirrors
在unity cg中可以使用[HideInInspector]来隐藏uniform属性,这样就可以用作自定义常量。
Physically Based Rendering: Tutorial: Physically Based Rendering, And you can too!
边缘检测:1) http://www.codeproject.com/Articles/94817/Pixel-Shader-for-Edge-Detection-and-Cartoon-Effect
2) http://coding-experiments.blogspot.hk/2010/06/edge-detection.html
3) http://en.wikipedia.org/wiki/Edge_detection
Cg函数表:http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_e.html
heat effect : http://forum.unity3d.com/threads/50132-Heat-Distortion, http://www.cnblogs.com/geoffyange/archive/2013/06/06/3122570.html
skin shading in unity: http://www.altdevblogaday.com/2011/12/31/skin-shading-in-unity3d/
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch14.html
http://gamedev.stackexchange.com/questions/31308/algorithm-for-creating-spheres
RenderMan University: http://renderman.pixar.com/view/renderman-university
一些shader的例子:
Shader "stalendp/shaderTest02" { //see https://www.shadertoy.com/view/4sj3zy Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 #include "UnityCG.cginc" sampler2D _MainTex; //Variable declarations struct myvars { float3 bgColor; float sphereScale; float sphereShine; float3 sphereDiff; float3 sphereSpec; float2 specPoint; }; float4 vert(appdata_base v) : POSITION { return mul(UNITY_MATRIX_MVP, v.vertex); } float4 frag(float4 sp:WPOS): COLOR { myvars mv; mv.bgColor = float3(0.6, 0.5, 0.6); mv.sphereScale = 0.7; mv.sphereShine = 0.5; mv.sphereDiff = float3(0.5, 0.0, 0.5); mv.sphereSpec = float3(1.0, 1.0, 1.0); mv.specPoint = float2(0.2, -0.1); // creates shader pixel coordinates float2 uv = sp.xy/_ScreenParams.xy; // sets the position of the camera float2 p = uv * 2.5 - float2(1.0, 1.0); p.x *= _ScreenParams.x / _ScreenParams.y; // Rotates the sphere in a circle p.x += cos(-_Time.y) *0.35; p.y += sin(-_Time.y) * 0.35; // Rotates the specular point with the sphere mv.specPoint.x += cos(-_Time.y) * 0.35; mv.specPoint.y += sin(-_Time.y) * 0.35; //Sets the radius of the sphere to the middle of the screen float radius = length(p);//sqrt(dot(p, p)); float3 col = mv.bgColor; //Sets the initial dark shadow around the edge of the sphere float f = smoothstep(mv.sphereScale * 0.7, mv.sphereScale, length(p + mv.specPoint)); col -= lerp(col, float3(0.0,0.0,0.0), f) * 0.2; //Only carries out the logic if the radius of the sphere is less than the scale if(radius <br> <br> <pre class="brush:php;toolbar:false">Shader "Custom/shaderTest03" { // https://www.shadertoy.com/view/Xdf3DS Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 #include "UnityCG.cginc" sampler2D _MainTex; struct myvars { float k; float f; float threshold; float3 colour; float3 normal; float3 lightPos; float3 lightColour; float3 ambient; float shinyness; float diffuseFactor; float4 fragCoord; }; float2 center ( float2 border , float2 _offset , float2 vel, myvars mv) { float2 c = _offset + vel * _Time * 0.5; c = fmod ( c , 2. - 4. * border ); if ( c.x > 1. - border.x ) c.x = 2. - c.x - 2. * border.x; if ( c.x 1. - border.y ) c.y = 2. - c.y - 2. * border.y; if ( c.y b ) return 0.0; if ( r >= b/3.0 ) { float rb = 1.0 - r/b; return (3.0*mv.k)/2.0 * rb * rb; } if ( r >= 0.0 && r <br> <pre class="brush:php;toolbar:false">Shader "stalendp/shaderTest04" { //see https://www.shadertoy.com/view/Xsf3R8 Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 #include "UnityCG.cginc" sampler2D _MainTex; struct Ray { float3 org; float3 dir; }; float rayPlaneIntersect( Ray ray, float4 plane ) { float f = dot( ray.dir, plane.xyz ); float t = -( dot( ray.org, plane.xyz ) + plane.w ); t /= f; return t; } float3 shade( float3 pos, float3 nrm, float4 light ) { float3 toLight = light.xyz - pos; float toLightLen = length( toLight ); toLight = normalize( toLight ); float diff = dot( nrm, toLight ); float attn = 1.0 - pow( min( 1.0, toLightLen / light.w ), 2.0 ); float comb = 2.0 * diff * attn; return float3( comb, comb, comb ); } float4 vert(appdata_base v) : POSITION { return mul(UNITY_MATRIX_MVP, v.vertex); } float4 frag(float4 sp:WPOS): COLOR { // gl_FragCoord: location (0.5, 0.5) is returned // for the lower-left-most pixel in a window // XY of the normalized device coordinate // ranged from [-1, 1] float2 ndcXY = -1.0 + 2.0 * sp.xy / _ScreenParams.xy; // aspect ratio float aspectRatio = _ScreenParams.x / _ScreenParams.y; // scaled XY which fits the aspect ratio float2 scaledXY = ndcXY * float2( aspectRatio, 1.0 ); // camera XYZ in world space float3 camWsXYZ = float3( 0.0, 1.0, 0.0 ); camWsXYZ.z += 10.0 * cos( _Time.y ); // construct the ray in world space Ray ray; ray.org = camWsXYZ; ray.dir = float3( scaledXY, -2.0 ); // OpenGL is right handed // define the plane in world space float4 plane = float4( 0.0, 1.0, 0.0, 0.0 ); float t = rayPlaneIntersect( ray, plane ); // define the point light in world space (XYZ, range) float4 lightWs = float4( 0.0, 5.0, -5.0, 10.0 ); if ( t >= 0.0 ) { float3 sceneWsPos = ray.org + t * ray.dir; float3 sceneWsNrm = plane.xyz; float2 sceneUV = sceneWsPos.xz / 4.0; float4 sceneBase = tex2D( _MainTex, sceneUV ); float3 sceneShade = shade( sceneWsPos, sceneWsNrm, lightWs ); return float4( sceneShade * sceneBase.xyz, 1.0 ); } return float4( 0.0, 0.0, 0.0, 1.0 ); } ENDCG } } FallBack "Diffuse" }
Shader "stalendp/shaderTest04" { //see https://www.shadertoy.com/view/MdB3Dw Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 #include "UnityCG.cginc" #define USE_ANALYTICAL_MBLUR sampler2D _MainTex; // intersect a MOVING sphere float2 iSphere( in float3 ro, in float3 rd, in float4 sp, in float3 ve, out float3 nor ) { float t = -1.0; float s = 0.0; nor = float3(0.0); float3 rc = ro - sp.xyz; float A = dot(rc,rd); float B = dot(rc,rc) - sp.w*sp.w; float C = dot(ve,ve); float D = dot(rc,ve); float E = dot(rd,ve); float aab = A*A - B; float eec = E*E - C; float aed = A*E - D; float k = aed*aed - eec*aab; if( k>0.0 ) { k = sqrt(k); float hb = (aed - k)/eec; float ha = (aed + k)/eec; float ta = max( 0.0, ha ); float tb = min( 1.0, hb ); if( ta 0.0 ) { t = -b - sqrt(k); nor = normalize( (ro+rd*t) - sp.xyz ); } return t; } float3 getPosition( float time ) { return float3( 2.5*sin(8.0*time), 0.0, 1.0*cos(8.0*time) ); } float3 getVelocity( float time ) { return float3( 8.0*2.5*cos(8.0*time), 0.0, -8.0*1.0*sin(8.0*time) ); } float4 vert(appdata_base v) : POSITION { return mul(UNITY_MATRIX_MVP, v.vertex); } float4 frag(float4 sp:WPOS): COLOR { float2 q = sp.xy / _ScreenParams.xy; float2 p = -1.0 + 2.0*q; p.x *= _ScreenParams.x/_ScreenParams.y; // camera float3 ro = float3(0.0,0.0,4.0); float3 rd = normalize( float3(p.xy,-2.0) ); // sphere // render float3 col = float3(0.0); #ifdef USE_ANALYTICAL_MBLUR //--------------------------------------------------- // render with analytical motion blur //--------------------------------------------------- float3 ce = getPosition( _Time.y ); float3 ve = getVelocity( _Time.y ); col = float3(0.25) + 0.3*rd.y; float3 nor = float3(0.0); float3 tot = float3(0.25) + 0.3*rd.y; float2 res = iSphere( ro, rd, float4(ce,1.0), ve/24.0, nor ); float t = res.x; if( t>0.0 ) { float dif = clamp( dot(nor,float3(0.5703)), 0.0, 1.0 ); float amb = 0.5 + 0.5*nor.y; float3 lcol = dif*float3(1.0,0.9,0.3) + amb*float3(0.1,0.2,0.3); col = lerp( tot, lcol, res.y ); } #else //--------------------------------------------------- // render with brute force sampled motion blur //--------------------------------------------------- #define NUMSAMPLES 32 float3 tot = float3(0.0); for( int i=0; i<numsamples i float fi="float(i)/float(NUMSAMPLES);" float3 ce="getPosition(" _time.y nor="float3(0.0);" tmp="float3(0.25)" t="iSphere(" ro rd float4 if>0.0 ) { float dif = clamp( dot(nor,float3(0.5703)), 0.0, 1.0 ); float amb = 0.5 + 0.5*nor.y; tmp = dif*float3(1.0,0.9,0.3) + amb*float3(0.1,0.2,0.3); } col += tmp; } col /= float(NUMSAMPLES); #endif col = pow( clamp(col,0.0,1.0), float3(0.45) ); return float4( col, 1.0 ); } ENDCG } } FallBack "Diffuse" } </numsamples>
Shader "stalendp/shaderTest05" { //see https://www.shadertoy.com/view/XsB3DW Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _CubeDiffuse ("Cubemap Diffuse Map", CUBE) = "" {} vv1("vv1", float) = -1.0 vv2("vv2", float) = 2.0 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 3.0 //下面防止编译错误:instruction limit of 1024 exceed; #pragma glsl #include "UnityCG.cginc" #define MAX_STEPS 64 #define MAX_REFLECTIONS 4 #define PI 3.1415926536 sampler2D _MainTex; samplerCUBE _CubeDiffuse; float vv1, vv2; struct Ray { float3 o; float3 d; }; struct Sphere { float3 o; float r; }; struct Box { float3 o; float3 s; }; struct Torus { float3 o; float2 s; }; float2 rotate2d(in float2 v, in float a) { float sinA = sin(a); float cosA = cos(a); return float2(v.x * cosA - v.y * sinA, v.y * cosA + v.x * sinA); } float sdSphere(in float3 p, in Sphere s) { return length(p-s.o)-s.r; } float sdBox(in float3 p, in Box b) { float3 d = abs(p-b.o) - b.s; return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0)); } float sdTorus(in float3 p, in Torus t) { p -= t.o; float2 q = float2(length(p.xz)-t.s.x,p.y); return length(q)-t.s.y; } float world(in float3 p) { float ti = fmod(_Time.y,10.); if(ti > 2.) { Sphere s0 = Sphere(float3(0),1.); Box b0 = Box(float3(0),float3(.8)); if(ti <br> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">
CGINCLUDE的使用

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Win11小技巧分享:一招跳過微軟帳號登入Windows11是微軟最新推出的作業系統,具有全新的設計風格和許多實用的功能。然而,對於某些用戶來說,在每次啟動系統時都要登入微軟帳戶可能會感到有些煩擾。如果你是其中一員,不妨試試以下的技巧,讓你能夠跳過微軟帳號登錄,直接進入桌面介面。首先,我們需要在系統中建立一個本機帳戶,來取代微軟帳戶登入。這樣做的好處是

一、今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 1.開通基礎權益:原創文章選擇投放廣告可獲得收益,影片必須原創橫屏才會有收益。 2.開通百粉權益:粉絲量達百粉以上,微頭條、原創問答創作及問答均可獲得收益。 3.堅持原創作品:原創作品包含文章、微標題及問題等,要求300字以上。注意違規抄襲作品作為原創發布,會被扣信用分,即使有收益也會被扣除。 4.垂直度:做專業領域一類的文章,不能隨意跨領域寫文章,會得不到合適的推薦,達不到作品的專和精,難以吸引粉絲讀者。 5.活躍度:活躍度高,

在Go語言中難以實現類似集合的功能,是困擾許多開發者的問題。相較於其他程式語言如Python或Java,Go語言並沒有內建的集合類型,如set、map等,這給開發者在實作集合功能時帶來了一些挑戰。首先,讓我們來看看為何在Go語言中難以直接實現類似集合的功能。在Go語言中,最常用的資料結構是slice(切片)和map(映射),它們可以完成類似集合的功能,但

C語言中,表示指針,儲存其他變數的位址;&表示位址運算符,傳回變數的記憶體位址。指針的使用技巧包括定義指針、解引用指針,需確保指針指向有效地址;地址運算符&的使用技巧包括取得變數地址,取得數組元素地址時返回數組第一元素地址。實戰案例說明了使用指標和位址運算子反轉字串。

星露穀物語中硬木是一種重要的合成材料,我們在遊戲中能夠有著很多用途,所以在日常的時候可以囤一下,硬木具體有什麼途徑能夠獲得呢,下面就為大家帶來星露谷物語硬木取得途徑,有需要的話可以參考一下。星露穀物語硬木獲取途徑1、每天前去秘密森林採掘樹樁可以快速獲得硬木。 2.在秘密森林中採掘樹樁和打怪有機率獲得桃花心木種籽。 3.將種子種在院子中會長出桃花心木。 4.最後將桃花心木採掘後也可以快速獲得大量硬木。

我們經常在excel中製作和編輯表格,但是作為一個剛剛接觸軟體的新手來講,如何使用excel製作表格,並沒有我們使用起來那麼輕鬆。下邊,我們針對新手,也就是初學者需要掌握的表格製作的一些步驟進行一些演練,希望對需要的人有些幫助。新手錶格範例樣板如下圖:我們看看如何完成! 1,新建excel文檔,有兩種方法。可以在【桌面】空白位置,點選滑鼠右鍵-【新建】-【xls】檔。也可以【開始】-【所有程式】-【MicrosoftOffice】-【MicrosoftExcel20**】2,雙擊我們新建的ex

VSCode(VisualStudioCode)是一款由微軟開發的開源程式碼編輯器,具有強大的功能和豐富的插件支持,成為開發者的首選工具之一。本文將為初學者提供一個入門指南,幫助他們快速掌握VSCode的使用技巧。在本文中,將介紹如何安裝VSCode、基本的編輯操作、快捷鍵、插件安裝等內容,並為讀者提供具體的程式碼範例。 1.安裝VSCode首先,我們需

標題:PHP程式設計技巧:如何實現3秒內跳轉網頁在Web開發中,經常會遇到需要在一定時間內自動跳到另一個頁面的情況。本文將介紹如何使用PHP實作在3秒內實現頁面跳轉的程式設計技巧,並提供具體的程式碼範例。首先,實現頁面跳轉的基本原理是透過HTTP的回應頭中的Location欄位來實現。透過設定該欄位可以讓瀏覽器自動跳到指定的頁面。下面是一個簡單的例子,示範如何在P
