diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-04-19 13:01:16 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-04-19 13:09:18 +0300 |
commit | fa3bd17ae87301ca198d16d2dc7d2432548f34f9 (patch) | |
tree | c08eb8740784799dd3bf9517f4eb4380bc4e6cab /source/blender/gpu/shaders | |
parent | 1e3f4c70ab56578b8b0e0056870bd17cc118982a (diff) |
GPU: Replace `GPUMaterialVolumeGrid` by `GPUMaterialAttribute`
This is to make the codegen and shading nodes object type agnostic. This
is essential for flexibility of the engine to use the nodetree as it see
fits.
The essential volume attributes struct properties are moved to the
`GPUMaterialAttribute` which see its final input name set on creation.
The binding process is centralized into `draw_volume.cc` to avoid
duplicating the code between multiple engines. It mimics the hair attributes
process.
Volume object grid transforms and other per object uniforms are packed into
one UBO per object. The grid transform is now based on object which simplify
the matrix preparations.
This also gets rid of the double transforms and use object info orco factors
for volume objects.
Tagging @brecht because he did the initial implementation of Volume Grids.
Diffstat (limited to 'source/blender/gpu/shaders')
3 files changed, 18 insertions, 55 deletions
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_attribute.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_attribute.glsl index faf37db3ea6..2ae53b35b3f 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_attribute.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_attribute.glsl @@ -1,3 +1,17 @@ + +void node_attribute_color(vec4 attr, out vec4 out_attr) +{ + out_attr = attr_load_color_post(attr); +} + +void node_attribute_temperature(vec4 attr, out vec4 out_attr) +{ + out_attr.x = attr_load_temperature_post(attr.x); + out_attr.y = 0.0; + out_attr.z = 0.0; + out_attr.w = 1.0; +} + void node_attribute( vec4 attr, out vec4 outcol, out vec3 outvec, out float outf, out float outalpha) { diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl deleted file mode 100644 index 464cf5227b4..00000000000 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_info.glsl +++ /dev/null @@ -1,51 +0,0 @@ - -/* Uniforms to convert smoke grid values into standard range. */ -uniform vec3 volumeColor = vec3(1.0); -uniform vec2 volumeTemperature = vec2(0.0); - -/* Generic volume attribute. */ -void node_attribute_volume(sampler3D tex, mat4 transform, vec3 cos, out vec3 outvec) -{ - /* Optional per-grid transform. */ - if (transform[3][3] != 0.0) { - cos = (transform * vec4(cos, 1.0)).xyz; - } - - outvec = texture(tex, cos).rgb; -} - -/* Special color attribute for smoke. */ -void node_attribute_volume_color(sampler3D tex, mat4 transform, vec3 cos, out vec3 outvec) -{ - /* Optional per-grid transform. */ - if (transform[3][3] != 0.0) { - cos = (transform * vec4(cos, 1.0)).xyz; - } - - /* Density is premultiplied for interpolation, divide it out here. */ - vec4 value = texture(tex, cos).rgba; - if (value.a > 1e-8) { - value.rgb /= value.a; - } - - outvec = value.rgb * volumeColor; -} - -/* Special temperature attribute for smoke. */ -void node_attribute_volume_temperature(sampler3D tex, mat4 transform, vec3 cos, out float outf) -{ - /* Optional per-grid transform. */ - if (transform[3][3] != 0.0) { - cos = (transform * vec4(cos, 1.0)).xyz; - } - - float value = texture(tex, cos).r; - if (volumeTemperature.x < volumeTemperature.y) { - outf = (value > 0.01) ? - volumeTemperature.x + value * (volumeTemperature.y - volumeTemperature.x) : - 0.0; - } - else { - outf = value; - } -} diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl index 1127c34b3ac..21c4aba0ffe 100644 --- a/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl +++ b/source/blender/gpu/shaders/material/gpu_shader_material_volume_principled.glsl @@ -10,9 +10,9 @@ void node_volume_principled(vec4 color, vec4 blackbody_tint, float temperature, float weight, - float density_attribute, + vec4 density_attribute, vec4 color_attribute, - float temperature_attribute, + vec4 temperature_attribute, sampler1DArray spectrummap, float layer, out Closure result) @@ -25,7 +25,7 @@ void node_volume_principled(vec4 color, density = max(density, 0.0); if (density > 1e-5) { - density = max(density * density_attribute, 0.0); + density = max(density * density_attribute.x, 0.0); } if (density > 1e-5) { @@ -47,7 +47,7 @@ void node_volume_principled(vec4 color, if (blackbody_intensity > 1e-3) { /* Add temperature from attribute. */ - float T = max(temperature * max(temperature_attribute, 0.0), 0.0); + float T = max(temperature * max(temperature_attribute.x, 0.0), 0.0); /* Stefan-Boltzman law. */ float T2 = T * T; |