為什麼ShaderToy選擇了GLSL?
因為項目原因最近開始學習shader--Unity,但是發現ShaderToy是GLSL。
我搞過兩種 ShaderToy 的變種,原理很簡單,走圖形 API 的畫就是畫個全屏矩形,走通用計算 API 的話就是對二維數組進行圖像處理的思路。
1. HLSL vinjn/shadertoy-dx11
// demonstrate the use of local image
// photo_4.jpg
// ducky.png
float4 main(float4 pos : SV_POSITION) : SV_Target
{
float4 clr0 = textures[0].Sample( smooth, pos.xy / resolution );
float4 clr1 = textures[1].Sample( blocky, pos.xy / resolution );
return lerp(clr0, clr1, mouse.x / resolution.x);
}
2. CUDA island-org/island
#include "shadertoy.cuh"
extern "C" __global__ void mainImage()
{
float2 fragCoord = calcFragCoord();
float u = fragCoord.x / iResolution.x;
float v = fragCoord.y / iResolution.y;
if ((fragCoord.x &< iResolution.x) (fragCoord.y &< iResolution.y)) { uchar4* fragColor = calcFragColor(fragCoord); *fragColor = make_uchar4(u * 255, v * 255, 122 + 122 * sin(iGlobalTime), 255); } }
因為shadertoy本來就是給GLSL程序員玩的playground。
如果你想要玩 hlsl 的話,可以試試 @Vinjn張靜 寫的vinjn/shadertoy-dx11.
當然你如果只是想要把shadertoy搬運到unity的話,可以看看馮樂樂的這篇文章。【ShaderToy】開篇 - candycat
webgl所以glsl簡單直接看幾天文檔,你也可以做個差不多的頁面
GLSL、HLSL、cg函數之間的差異很小,都不用去記差異,而Unity Shader是封裝之後的shader,寫起來更簡單了。看shadertoy關鍵是理解圖形學原理,發現有用的代碼轉其他shader語言上是很容易的,我曾經轉過幾個到unity中,只需改很少代碼就可以。常見的差異比如:
iResolution =》_ScreenParamsiGlobalTime =&> _Time.yglFragCoord =&> float4 sp:WPOS vec2 =&> float2mix =&> lerp
mod =&> fmodtexture2D =&> tex2DtextureCube =&> texCUBEmat2=&>float2x2
fract=&>frac另外GLSL和HLSL之間的差異可以參考這篇文章:http://gad.qq.com/program/translateview/7168849推薦閱讀:
※計算機圖形學中,面的最小基本單位為什麼一般是三角形?
※操作系統是如何管理GPU等計算資源的?
※光照和陰影演算法該如何優化?
※圖形渲染中關於CPU和GPU的一些問題?
※對多重採樣(MSAA)原理的一些疑問?