Skip to content

Commit acbb3ae

Browse files
committed
.
1 parent ed28999 commit acbb3ae

File tree

2 files changed

+47
-36
lines changed

2 files changed

+47
-36
lines changed

src/lib/data/tasks.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

src/lib/data/tasks/VolumeRaymarching.md

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -155,27 +155,33 @@ uniform vec3 cameraDirection;
155155
uniform sampler3D volumeTexture;
156156
uniform ivec2 iResolution;
157157
158-
const float stepSize = 0.001;
158+
const float stepSize = 0.0015;
159159
const int maxSteps = 1024;
160160
const vec3 lightDir = normalize(vec3(1.0, 1.0, 0.0));
161161
const float orthoScale = 0.5;
162162
163163
vec3 ComputeGradient(vec3 UVW) {
164164
vec3 H = 1.0 / vec3(textureSize(volumeTexture, 0)); // Texelgröße
165165
166-
float Fx1 = texture(volumeTexture, clamp(UVW + vec3(H.x, 0.0, 0.0), 0.0, 1.0)).r; // +x Probe
167-
float Fx2 = texture(volumeTexture, clamp(UVW - vec3(H.x, 0.0, 0.0), 0.0, 1.0)).r; // -x Probe
166+
float Fx1 = texture(volumeTexture, clamp(UVW + vec3(H.x, 0.0, 0.0), 0.0, 1.0)).r;
167+
float Fx2 = texture(volumeTexture, clamp(UVW - vec3(H.x, 0.0, 0.0), 0.0, 1.0)).r;
168168
169-
float Fy1 = texture(volumeTexture, clamp(UVW + vec3(0.0, H.y, 0.0), 0.0, 1.0)).r; // +y Probe
170-
float Fy2 = texture(volumeTexture, clamp(UVW - vec3(0.0, H.y, 0.0), 0.0, 1.0)).r; // -y Probe
169+
float Fy1 = texture(volumeTexture, clamp(UVW + vec3(0.0, H.y, 0.0), 0.0, 1.0)).r;
170+
float Fy2 = texture(volumeTexture, clamp(UVW - vec3(0.0, H.y, 0.0), 0.0, 1.0)).r;
171171
172-
float Fz1 = texture(volumeTexture, clamp(UVW + vec3(0.0, 0.0, H.z), 0.0, 1.0)).r; // +z Probe
173-
float Fz2 = texture(volumeTexture, clamp(UVW - vec3(0.0, 0.0, H.z), 0.0, 1.0)).r; // -z Probe
172+
float Fz1 = texture(volumeTexture, clamp(UVW + vec3(0.0, 0.0, H.z), 0.0, 1.0)).r;
173+
float Fz2 = texture(volumeTexture, clamp(UVW - vec3(0.0, 0.0, H.z), 0.0, 1.0)).r;
174174
175-
return normalize(-vec3(Fx1 - Fx2, Fy1 - Fy2, Fz1 - Fz2)); // Zentraldiff, Negation
175+
vec3 grad = vec3(
176+
(Fx1 - Fx2) / (2.0 * H.x),
177+
(Fy1 - Fy2) / (2.0 * H.y),
178+
(Fz1 - Fz2) / (2.0 * H.z)
179+
);
180+
return grad; // nthält auch die stärke über die Länge
176181
}
177182
178-
vec4 TransferFunction(float F, float gradientMagnitude) {
183+
vec4 TransferFunction(float F, float gradientMagnitude)
184+
{
179185
const float huAir = -750.0;
180186
const float huTissue = 50.0;
181187
const float huBone = 700.0;
@@ -185,36 +191,41 @@ vec4 TransferFunction(float F, float gradientMagnitude) {
185191
const float alphaBone = 1.0;
186192
187193
const vec3 colorAir = vec3(0.0);
188-
const vec3 colorTissue = vec3(0.9, 0.7, 0.6);
189-
const vec3 colorBone = vec3(1.0, 1.0, 0.95);
190-
191-
float alpha = 0.0;
192-
vec3 Color = colorAir;
193-
194-
if (F >= huAir && F <= huTissue) {
195-
float T = (F - huAir) / (huTissue - huAir); // Air >Tissue Mix
196-
alpha = mix(alphaAir, alphaTissue, T);
197-
Color = mix(colorAir, colorTissue, T);
198-
} else if (F >= huTissue && F <= huBone) {
199-
float T = (F - huTissue) / (huBone - huTissue); // Tissue > Bone Mix
200-
alpha = mix(alphaTissue, alphaBone, T);
201-
Color = mix(colorTissue, colorBone, T);
202-
} else if (F > huBone) {
203-
alpha = alphaBone; // Bone+
204-
Color = colorBone;
194+
const vec3 colorTissue = vec3(0.929, 0.675, 0.522);
195+
const vec3 colorBone = vec3(0.949, 0.898, 0.643);
196+
197+
float alpha;
198+
vec3 color;
199+
if (F <= huAir) {
200+
alpha = alphaAir;
201+
color = colorAir;
202+
}
203+
else if (F < huTissue) {
204+
float t = (F - huAir) / (huTissue - huAir);
205+
alpha = mix(alphaAir, alphaTissue, t);
206+
color = mix(colorAir, colorTissue, t);
207+
}
208+
else if (F < huBone) {
209+
float t = (F - huTissue) / (huBone - huTissue);
210+
alpha = mix(alphaTissue, alphaBone, t);
211+
color = mix(colorTissue, colorBone, t);
212+
}
213+
else {
214+
alpha = alphaBone;
215+
color = colorBone;
205216
}
206217
207-
// hermit Interpolation zwischen 0 und 1, lower bound, upper bound, source Wert
208-
alpha *= smoothstep(0.05, 0.2, gradientMagnitude); // Übergang mit Gradient verstärken
218+
// Gewichtung mit Gradient um die Kanten zwischen Oberflächen deutlich zu machen
219+
alpha *= 1.0 - exp(-5.0 * clamp(gradientMagnitude / 8.0, 0.0, 1.0)); // 0 -> flat region, 1 -> sharp edge
209220
210-
return vec4(Color, alpha);
221+
return vec4(color, alpha);
211222
}
212223
213224
vec3 PhongShade(vec3 N, vec3 BaseColor, vec3 ViewDir, vec3 lightDir) {
214-
const vec3 Ka = vec3(0.5); // Ambient
215-
const vec3 Kd = vec3(0.5); // Diffus
216-
const vec3 Ks = vec3(1.0); // Spekular
217-
const float NExp = 20.0; // Rauheit
225+
const vec3 Ka = vec3(0.01); // Ambient
226+
const vec3 Kd = vec3(1.0); // Diffus
227+
const vec3 Ks = vec3(0.3); // Spekular
228+
const float NExp = 120.0; // Rauheit
218229
219230
vec3 H = normalize(ViewDir + lightDir); // Halfvector
220231
float Diff = max(dot(N, lightDir), 0.0); // Diffus
@@ -243,7 +254,7 @@ vec4 SampleVolume(vec3 UVW, vec3 rayDir) {
243254
float gradientMagnitude = length(Grad);
244255
245256
vec4 Mat = TransferFunction(F, gradientMagnitude); // Materialdaten
246-
vec3 Shaded = PhongShade(normalize(Grad), Mat.rgb, normalize(-rayDir), lightDir); // Beleuchtung
257+
vec3 Shaded = PhongShade(normalize(-Grad), Mat.rgb, normalize(-rayDir), lightDir); // Beleuchtung
247258
248259
return vec4(Shaded, Mat.a); // Farbe + alpha
249260
}
@@ -252,7 +263,7 @@ void main() {
252263
vec3 rayOrigin, rayDir;
253264
GenerateRay(rayOrigin, rayDir); // Strahl erzeugen
254265
255-
float TNear = 0.01; // Start
266+
float TNear = 0.001; // Start
256267
float TFar = 2.0; // Ende
257268
258269
vec3 ColorAccum = vec3(0.0); // Farbspeicher

0 commit comments

Comments
 (0)