【Shader】 볼륨 렌더링으로 3D 노이즈를 가시화한다
소개
볼륨 렌더링은 구름 표현이나 CT, MRI 이미지 등에 사용되는 렌더링 방식입니다.
이 볼륨 렌더링과 3D 노이즈를 결합하여 놀아갑니다.
완성
메쉬에는 프리미티브의 Cube를 사용하고 있습니다. 볼륨 렌더링을 적용하는 것으로, 마치 Cube에 내용이 있는 것 같은 표현이 되어 있다고 생각합니다
치유되는구나~~
Cube3개
소스 코드
참고로 받은 기사나 GitHub의 소스를 잘라 붙인 정도의 내용입니다
이번에는 유선 표현에 이용되는 컬 노이즈를 사용합니다.SimplexNoise.cginc
는 Keijiro의 SimplexNoise3D.hlsl을 사용합니다.
VolumeCurlNoise.shaderShader "Volume/CurlNoise" {
Properties {
[HDR] _Color ("Color", Color) = (1,1,1,1)
_Size ("Size", Range(0, 10)) = 1.0
_Iteration("Iteration", Int) = 10
_Intensity("Intensity", Range(0, 1)) = 0.1
}
SubShader {
Tags { "RenderType"="Transparent" "RenderQueue"="Transparent" }
Cull Off
ZWrite Off
CGPROGRAM
#pragma surface surf Lambert alpha vertex:vert
#include "SimplexNoise.cginc"
struct Input {
float3 worldPos;
float3 localPos;
float3 viewDir;
};
fixed4 _Color;
int _Iteration;
fixed _Intensity;
fixed _Size;
float3 curlnoise(float3 p) {
const float e = 0.009765625;
const float e2 = 2.0 * e;
float3 dx = float3(e, 0., 0.);
float3 dy = float3(0., e, 0.);
float3 dz = float3(0., 0., e);
float3 p_x0 = snoise(p - dx);
float3 p_x1 = snoise(p + dx);
float3 p_y0 = snoise(p - dy);
float3 p_y1 = snoise(p + dy);
float3 p_z0 = snoise(p - dz);
float3 p_z1 = snoise(p + dz);
float x = p_y1.z - p_y0.z + p_z0.y;
float y = p_z1.x - p_z0.x + p_x0.z;
float z = p_x1.y - p_x0.y + p_y0.x;
return normalize(float3(x, y, z) / e2);
}
void vert (inout appdata_full v, out Input data) {
UNITY_INITIALIZE_OUTPUT(Input,data);
data.localPos = v.vertex;
data.worldPos = mul(unity_ObjectToWorld, v.vertex);
}
void surf (Input IN, inout SurfaceOutput o) {
float3 wdir = IN.worldPos - _WorldSpaceCameraPos;
float3 ldir = normalize(mul(unity_WorldToObject, wdir));
float3 lstep = ldir / _Iteration;
float3 lpos = IN.localPos;
fixed output = 0.0;
[loop]
for (int i = 0; i < _Iteration; ++i)
{
fixed a = curlnoise((lpos + 0.5) * _Size).r;
output += (1 - output) * a * _Intensity;
lpos += lstep;
if (!all(max(0.5 - abs(lpos), 0.0))) break;
}
fixed4 c = _Color * output;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
참고
Unity에서 볼륨 렌더링 시도 - vol.1 데이터 표시
Noise Shader Library for Unity
Curl Noise 써 보았다
Reference
이 문제에 관하여(【Shader】 볼륨 렌더링으로 3D 노이즈를 가시화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ryopon/items/75e9d07fbe4285c3db56
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
메쉬에는 프리미티브의 Cube를 사용하고 있습니다. 볼륨 렌더링을 적용하는 것으로, 마치 Cube에 내용이 있는 것 같은 표현이 되어 있다고 생각합니다
치유되는구나~~
Cube3개
소스 코드
참고로 받은 기사나 GitHub의 소스를 잘라 붙인 정도의 내용입니다
이번에는 유선 표현에 이용되는 컬 노이즈를 사용합니다.
SimplexNoise.cginc
는 Keijiro의 SimplexNoise3D.hlsl을 사용합니다.VolumeCurlNoise.shader
Shader "Volume/CurlNoise" {
Properties {
[HDR] _Color ("Color", Color) = (1,1,1,1)
_Size ("Size", Range(0, 10)) = 1.0
_Iteration("Iteration", Int) = 10
_Intensity("Intensity", Range(0, 1)) = 0.1
}
SubShader {
Tags { "RenderType"="Transparent" "RenderQueue"="Transparent" }
Cull Off
ZWrite Off
CGPROGRAM
#pragma surface surf Lambert alpha vertex:vert
#include "SimplexNoise.cginc"
struct Input {
float3 worldPos;
float3 localPos;
float3 viewDir;
};
fixed4 _Color;
int _Iteration;
fixed _Intensity;
fixed _Size;
float3 curlnoise(float3 p) {
const float e = 0.009765625;
const float e2 = 2.0 * e;
float3 dx = float3(e, 0., 0.);
float3 dy = float3(0., e, 0.);
float3 dz = float3(0., 0., e);
float3 p_x0 = snoise(p - dx);
float3 p_x1 = snoise(p + dx);
float3 p_y0 = snoise(p - dy);
float3 p_y1 = snoise(p + dy);
float3 p_z0 = snoise(p - dz);
float3 p_z1 = snoise(p + dz);
float x = p_y1.z - p_y0.z + p_z0.y;
float y = p_z1.x - p_z0.x + p_x0.z;
float z = p_x1.y - p_x0.y + p_y0.x;
return normalize(float3(x, y, z) / e2);
}
void vert (inout appdata_full v, out Input data) {
UNITY_INITIALIZE_OUTPUT(Input,data);
data.localPos = v.vertex;
data.worldPos = mul(unity_ObjectToWorld, v.vertex);
}
void surf (Input IN, inout SurfaceOutput o) {
float3 wdir = IN.worldPos - _WorldSpaceCameraPos;
float3 ldir = normalize(mul(unity_WorldToObject, wdir));
float3 lstep = ldir / _Iteration;
float3 lpos = IN.localPos;
fixed output = 0.0;
[loop]
for (int i = 0; i < _Iteration; ++i)
{
fixed a = curlnoise((lpos + 0.5) * _Size).r;
output += (1 - output) * a * _Intensity;
lpos += lstep;
if (!all(max(0.5 - abs(lpos), 0.0))) break;
}
fixed4 c = _Color * output;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
참고
Unity에서 볼륨 렌더링 시도 - vol.1 데이터 표시
Noise Shader Library for Unity
Curl Noise 써 보았다
Reference
이 문제에 관하여(【Shader】 볼륨 렌더링으로 3D 노이즈를 가시화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ryopon/items/75e9d07fbe4285c3db56
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Shader】 볼륨 렌더링으로 3D 노이즈를 가시화한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ryopon/items/75e9d07fbe4285c3db56텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)