@@ -155,27 +155,33 @@ uniform vec3 cameraDirection;
155155uniform sampler3D volumeTexture;
156156uniform ivec2 iResolution;
157157
158- const float stepSize = 0.001 ;
158+ const float stepSize = 0.0015 ;
159159const int maxSteps = 1024;
160160const vec3 lightDir = normalize(vec3(1.0, 1.0, 0.0));
161161const float orthoScale = 0.5;
162162
163163vec3 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
213224vec3 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