標籤:

為什麼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 =》_ScreenParams

iGlobalTime =&> _Time.y

glFragCoord =&> float4 sp:WPOS

vec2 =&> float2

mix =&> lerp

mod =&> fmod

texture2D =&> tex2D

textureCube =&> texCUBE

mat2=&>float2x2

fract=&>frac

另外GLSL和HLSL之間的差異可以參考這篇文章:

http://gad.qq.com/program/translateview/7168849


推薦閱讀:

計算機圖形學中,面的最小基本單位為什麼一般是三角形?
操作系統是如何管理GPU等計算資源的?
光照和陰影演算法該如何優化?
圖形渲染中關於CPU和GPU的一些問題?
對多重採樣(MSAA)原理的一些疑問?

TAG:OpenGL | CG | shader |