Merge branch 'blender-v3.2-release'
This commit is contained in:
commit
73fa571598
|
@ -1446,28 +1446,10 @@ class CYCLES_WORLD_PT_surface(CyclesButtonsPanel, Panel):
|
|||
layout.use_property_split = True
|
||||
|
||||
world = context.world
|
||||
view_layer = context.view_layer
|
||||
|
||||
if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
|
||||
layout.prop(world, "color")
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.use_property_decorate = False
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.prop_search(
|
||||
world,
|
||||
"lightgroup",
|
||||
view_layer,
|
||||
"lightgroups",
|
||||
text="Light Group",
|
||||
results_are_suggestions=True,
|
||||
)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.active = bool(world.lightgroup) and not any(lg.name == world.lightgroup for lg in view_layer.lightgroups)
|
||||
sub.operator("scene.view_layer_add_lightgroup", icon='ADD', text="").name = world.lightgroup
|
||||
|
||||
|
||||
class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Volume"
|
||||
|
@ -1616,6 +1598,40 @@ class CYCLES_WORLD_PT_settings_volume(CyclesButtonsPanel, Panel):
|
|||
sub.prop(cworld, "volume_step_size")
|
||||
|
||||
|
||||
class CYCLES_WORLD_PT_settings_light_group(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Light Group"
|
||||
bl_parent_id = "CYCLES_WORLD_PT_settings"
|
||||
bl_context = "world"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.world and CyclesButtonsPanel.poll(context)
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.use_property_split = True
|
||||
layout.use_property_decorate = False
|
||||
|
||||
world = context.world
|
||||
view_layer = context.view_layer
|
||||
|
||||
row = layout.row(align=True)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.prop_search(
|
||||
world,
|
||||
"lightgroup",
|
||||
view_layer,
|
||||
"lightgroups",
|
||||
text="Light Group",
|
||||
results_are_suggestions=True,
|
||||
)
|
||||
|
||||
sub = row.column(align=True)
|
||||
sub.active = bool(world.lightgroup) and not any(lg.name == world.lightgroup for lg in view_layer.lightgroups)
|
||||
sub.operator("scene.view_layer_add_lightgroup", icon='ADD', text="").name = world.lightgroup
|
||||
|
||||
|
||||
class CYCLES_MATERIAL_PT_preview(CyclesButtonsPanel, Panel):
|
||||
bl_label = "Preview"
|
||||
bl_context = "material"
|
||||
|
@ -2308,6 +2324,7 @@ classes = (
|
|||
CYCLES_WORLD_PT_settings,
|
||||
CYCLES_WORLD_PT_settings_surface,
|
||||
CYCLES_WORLD_PT_settings_volume,
|
||||
CYCLES_WORLD_PT_settings_light_group,
|
||||
CYCLES_MATERIAL_PT_preview,
|
||||
CYCLES_MATERIAL_PT_surface,
|
||||
CYCLES_MATERIAL_PT_volume,
|
||||
|
|
|
@ -750,6 +750,11 @@ double RenderScheduler::guess_display_update_interval_in_seconds_for_num_samples
|
|||
int RenderScheduler::calculate_num_samples_per_update() const
|
||||
{
|
||||
const double time_per_sample_average = path_trace_time_.get_average();
|
||||
/* Fall back to 1 sample if we have not recorded a time yet. */
|
||||
if (time_per_sample_average == 0.0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
const double num_samples_in_second = pixel_size_ * pixel_size_ / time_per_sample_average;
|
||||
|
||||
const double update_interval_in_seconds = guess_display_update_interval_in_seconds();
|
||||
|
|
|
@ -8,159 +8,188 @@
|
|||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Bump Node */
|
||||
|
||||
template<uint node_feature_mask>
|
||||
ccl_device_noinline void svm_node_set_bump(KernelGlobals kg,
|
||||
ccl_private ShaderData *sd,
|
||||
ccl_private float *stack,
|
||||
uint4 node)
|
||||
{
|
||||
#ifdef __RAY_DIFFERENTIALS__
|
||||
/* get normal input */
|
||||
uint normal_offset, scale_offset, invert, use_object_space;
|
||||
svm_unpack_node_uchar4(node.y, &normal_offset, &scale_offset, &invert, &use_object_space);
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
/* get normal input */
|
||||
uint normal_offset, scale_offset, invert, use_object_space;
|
||||
svm_unpack_node_uchar4(node.y, &normal_offset, &scale_offset, &invert, &use_object_space);
|
||||
|
||||
float3 normal_in = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
|
||||
float3 normal_in = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) :
|
||||
sd->N;
|
||||
|
||||
float3 dPdx = sd->dP.dx;
|
||||
float3 dPdy = sd->dP.dy;
|
||||
float3 dPdx = sd->dP.dx;
|
||||
float3 dPdy = sd->dP.dy;
|
||||
|
||||
if (use_object_space) {
|
||||
object_inverse_normal_transform(kg, sd, &normal_in);
|
||||
object_inverse_dir_transform(kg, sd, &dPdx);
|
||||
object_inverse_dir_transform(kg, sd, &dPdy);
|
||||
if (use_object_space) {
|
||||
object_inverse_normal_transform(kg, sd, &normal_in);
|
||||
object_inverse_dir_transform(kg, sd, &dPdx);
|
||||
object_inverse_dir_transform(kg, sd, &dPdy);
|
||||
}
|
||||
|
||||
/* get surface tangents from normal */
|
||||
float3 Rx = cross(dPdy, normal_in);
|
||||
float3 Ry = cross(normal_in, dPdx);
|
||||
|
||||
/* get bump values */
|
||||
uint c_offset, x_offset, y_offset, strength_offset;
|
||||
svm_unpack_node_uchar4(node.z, &c_offset, &x_offset, &y_offset, &strength_offset);
|
||||
|
||||
float h_c = stack_load_float(stack, c_offset);
|
||||
float h_x = stack_load_float(stack, x_offset);
|
||||
float h_y = stack_load_float(stack, y_offset);
|
||||
|
||||
/* compute surface gradient and determinant */
|
||||
float det = dot(dPdx, Rx);
|
||||
float3 surfgrad = (h_x - h_c) * Rx + (h_y - h_c) * Ry;
|
||||
|
||||
float absdet = fabsf(det);
|
||||
|
||||
float strength = stack_load_float(stack, strength_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
|
||||
if (invert)
|
||||
scale *= -1.0f;
|
||||
|
||||
strength = max(strength, 0.0f);
|
||||
|
||||
/* compute and output perturbed normal */
|
||||
float3 normal_out = safe_normalize(absdet * normal_in - scale * signf(det) * surfgrad);
|
||||
if (is_zero(normal_out)) {
|
||||
normal_out = normal_in;
|
||||
}
|
||||
else {
|
||||
normal_out = normalize(strength * normal_out + (1.0f - strength) * normal_in);
|
||||
}
|
||||
|
||||
if (use_object_space) {
|
||||
object_normal_transform(kg, sd, &normal_out);
|
||||
}
|
||||
|
||||
normal_out = ensure_valid_reflection(sd->Ng, sd->I, normal_out);
|
||||
stack_store_float3(stack, node.w, normal_out);
|
||||
}
|
||||
|
||||
/* get surface tangents from normal */
|
||||
float3 Rx = cross(dPdy, normal_in);
|
||||
float3 Ry = cross(normal_in, dPdx);
|
||||
|
||||
/* get bump values */
|
||||
uint c_offset, x_offset, y_offset, strength_offset;
|
||||
svm_unpack_node_uchar4(node.z, &c_offset, &x_offset, &y_offset, &strength_offset);
|
||||
|
||||
float h_c = stack_load_float(stack, c_offset);
|
||||
float h_x = stack_load_float(stack, x_offset);
|
||||
float h_y = stack_load_float(stack, y_offset);
|
||||
|
||||
/* compute surface gradient and determinant */
|
||||
float det = dot(dPdx, Rx);
|
||||
float3 surfgrad = (h_x - h_c) * Rx + (h_y - h_c) * Ry;
|
||||
|
||||
float absdet = fabsf(det);
|
||||
|
||||
float strength = stack_load_float(stack, strength_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
|
||||
if (invert)
|
||||
scale *= -1.0f;
|
||||
|
||||
strength = max(strength, 0.0f);
|
||||
|
||||
/* compute and output perturbed normal */
|
||||
float3 normal_out = safe_normalize(absdet * normal_in - scale * signf(det) * surfgrad);
|
||||
if (is_zero(normal_out)) {
|
||||
normal_out = normal_in;
|
||||
else
|
||||
{
|
||||
stack_store_float3(stack, node.w, zero_float3());
|
||||
}
|
||||
else {
|
||||
normal_out = normalize(strength * normal_out + (1.0f - strength) * normal_in);
|
||||
}
|
||||
|
||||
if (use_object_space) {
|
||||
object_normal_transform(kg, sd, &normal_out);
|
||||
}
|
||||
|
||||
normal_out = ensure_valid_reflection(sd->Ng, sd->I, normal_out);
|
||||
|
||||
stack_store_float3(stack, node.w, normal_out);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Displacement Node */
|
||||
|
||||
template<uint node_feature_mask>
|
||||
ccl_device void svm_node_set_displacement(KernelGlobals kg,
|
||||
ccl_private ShaderData *sd,
|
||||
ccl_private float *stack,
|
||||
uint fac_offset)
|
||||
{
|
||||
float3 dP = stack_load_float3(stack, fac_offset);
|
||||
sd->P += dP;
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
float3 dP = stack_load_float3(stack, fac_offset);
|
||||
sd->P += dP;
|
||||
}
|
||||
}
|
||||
|
||||
template<uint node_feature_mask>
|
||||
ccl_device_noinline void svm_node_displacement(KernelGlobals kg,
|
||||
ccl_private ShaderData *sd,
|
||||
ccl_private float *stack,
|
||||
uint4 node)
|
||||
{
|
||||
uint height_offset, midlevel_offset, scale_offset, normal_offset;
|
||||
svm_unpack_node_uchar4(node.y, &height_offset, &midlevel_offset, &scale_offset, &normal_offset);
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
uint height_offset, midlevel_offset, scale_offset, normal_offset;
|
||||
svm_unpack_node_uchar4(
|
||||
node.y, &height_offset, &midlevel_offset, &scale_offset, &normal_offset);
|
||||
|
||||
float height = stack_load_float(stack, height_offset);
|
||||
float midlevel = stack_load_float(stack, midlevel_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
float3 normal = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
|
||||
uint space = node.w;
|
||||
float height = stack_load_float(stack, height_offset);
|
||||
float midlevel = stack_load_float(stack, midlevel_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
float3 normal = stack_valid(normal_offset) ? stack_load_float3(stack, normal_offset) : sd->N;
|
||||
uint space = node.w;
|
||||
|
||||
float3 dP = normal;
|
||||
float3 dP = normal;
|
||||
|
||||
if (space == NODE_NORMAL_MAP_OBJECT) {
|
||||
/* Object space. */
|
||||
object_inverse_normal_transform(kg, sd, &dP);
|
||||
dP *= (height - midlevel) * scale;
|
||||
object_dir_transform(kg, sd, &dP);
|
||||
if (space == NODE_NORMAL_MAP_OBJECT) {
|
||||
/* Object space. */
|
||||
object_inverse_normal_transform(kg, sd, &dP);
|
||||
dP *= (height - midlevel) * scale;
|
||||
object_dir_transform(kg, sd, &dP);
|
||||
}
|
||||
else {
|
||||
/* World space. */
|
||||
dP *= (height - midlevel) * scale;
|
||||
}
|
||||
|
||||
stack_store_float3(stack, node.z, dP);
|
||||
}
|
||||
else {
|
||||
/* World space. */
|
||||
dP *= (height - midlevel) * scale;
|
||||
else
|
||||
{
|
||||
stack_store_float3(stack, node.z, zero_float3());
|
||||
}
|
||||
|
||||
stack_store_float3(stack, node.z, dP);
|
||||
}
|
||||
|
||||
template<uint node_feature_mask>
|
||||
ccl_device_noinline int svm_node_vector_displacement(
|
||||
KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint4 node, int offset)
|
||||
{
|
||||
uint4 data_node = read_node(kg, &offset);
|
||||
uint space = data_node.x;
|
||||
|
||||
uint vector_offset, midlevel_offset, scale_offset, displacement_offset;
|
||||
svm_unpack_node_uchar4(
|
||||
node.y, &vector_offset, &midlevel_offset, &scale_offset, &displacement_offset);
|
||||
|
||||
float3 vector = stack_load_float3(stack, vector_offset);
|
||||
float midlevel = stack_load_float(stack, midlevel_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
float3 dP = (vector - make_float3(midlevel, midlevel, midlevel)) * scale;
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
uint space = data_node.x;
|
||||
|
||||
if (space == NODE_NORMAL_MAP_TANGENT) {
|
||||
/* Tangent space. */
|
||||
float3 normal = sd->N;
|
||||
object_inverse_normal_transform(kg, sd, &normal);
|
||||
float3 vector = stack_load_float3(stack, vector_offset);
|
||||
float midlevel = stack_load_float(stack, midlevel_offset);
|
||||
float scale = stack_load_float(stack, scale_offset);
|
||||
float3 dP = (vector - make_float3(midlevel, midlevel, midlevel)) * scale;
|
||||
|
||||
const AttributeDescriptor attr = find_attribute(kg, sd, node.z);
|
||||
float3 tangent;
|
||||
if (attr.offset != ATTR_STD_NOT_FOUND) {
|
||||
tangent = primitive_surface_attribute_float3(kg, sd, attr, NULL, NULL);
|
||||
}
|
||||
else {
|
||||
tangent = normalize(sd->dPdu);
|
||||
if (space == NODE_NORMAL_MAP_TANGENT) {
|
||||
/* Tangent space. */
|
||||
float3 normal = sd->N;
|
||||
object_inverse_normal_transform(kg, sd, &normal);
|
||||
|
||||
const AttributeDescriptor attr = find_attribute(kg, sd, node.z);
|
||||
float3 tangent;
|
||||
if (attr.offset != ATTR_STD_NOT_FOUND) {
|
||||
tangent = primitive_surface_attribute_float3(kg, sd, attr, NULL, NULL);
|
||||
}
|
||||
else {
|
||||
tangent = normalize(sd->dPdu);
|
||||
}
|
||||
|
||||
float3 bitangent = normalize(cross(normal, tangent));
|
||||
const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w);
|
||||
if (attr_sign.offset != ATTR_STD_NOT_FOUND) {
|
||||
float sign = primitive_surface_attribute_float(kg, sd, attr_sign, NULL, NULL);
|
||||
bitangent *= sign;
|
||||
}
|
||||
|
||||
dP = tangent * dP.x + normal * dP.y + bitangent * dP.z;
|
||||
}
|
||||
|
||||
float3 bitangent = normalize(cross(normal, tangent));
|
||||
const AttributeDescriptor attr_sign = find_attribute(kg, sd, node.w);
|
||||
if (attr_sign.offset != ATTR_STD_NOT_FOUND) {
|
||||
float sign = primitive_surface_attribute_float(kg, sd, attr_sign, NULL, NULL);
|
||||
bitangent *= sign;
|
||||
if (space != NODE_NORMAL_MAP_WORLD) {
|
||||
/* Tangent or object space. */
|
||||
object_dir_transform(kg, sd, &dP);
|
||||
}
|
||||
|
||||
dP = tangent * dP.x + normal * dP.y + bitangent * dP.z;
|
||||
stack_store_float3(stack, displacement_offset, dP);
|
||||
}
|
||||
else
|
||||
{
|
||||
stack_store_float3(stack, displacement_offset, zero_float3());
|
||||
}
|
||||
|
||||
if (space != NODE_NORMAL_MAP_WORLD) {
|
||||
/* Tangent or object space. */
|
||||
object_dir_transform(kg, sd, &dP);
|
||||
}
|
||||
|
||||
stack_store_float3(stack, displacement_offset, dP);
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
|
|
@ -305,22 +305,13 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
|
|||
}
|
||||
break;
|
||||
case NODE_SET_DISPLACEMENT:
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
svm_node_set_displacement(kg, sd, stack, node.y);
|
||||
}
|
||||
svm_node_set_displacement<node_feature_mask>(kg, sd, stack, node.y);
|
||||
break;
|
||||
case NODE_DISPLACEMENT:
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
svm_node_displacement(kg, sd, stack, node);
|
||||
}
|
||||
svm_node_displacement<node_feature_mask>(kg, sd, stack, node);
|
||||
break;
|
||||
case NODE_VECTOR_DISPLACEMENT:
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
offset = svm_node_vector_displacement(kg, sd, stack, node, offset);
|
||||
}
|
||||
offset = svm_node_vector_displacement<node_feature_mask>(kg, sd, stack, node, offset);
|
||||
break;
|
||||
case NODE_TEX_IMAGE:
|
||||
offset = svm_node_tex_image(kg, sd, stack, node, offset);
|
||||
|
@ -332,10 +323,7 @@ ccl_device void svm_eval_nodes(KernelGlobals kg,
|
|||
offset = svm_node_tex_noise(kg, sd, stack, node.y, node.z, node.w, offset);
|
||||
break;
|
||||
case NODE_SET_BUMP:
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
{
|
||||
svm_node_set_bump(kg, sd, stack, node);
|
||||
}
|
||||
svm_node_set_bump<node_feature_mask>(kg, sd, stack, node);
|
||||
break;
|
||||
case NODE_ATTR_BUMP_DX:
|
||||
IF_KERNEL_NODES_FEATURE(BUMP)
|
||||
|
|
|
@ -618,6 +618,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size; k++) {
|
||||
attr_uchar4[offset + k] = data[k];
|
||||
}
|
||||
attr_uchar4.tag_modified();
|
||||
}
|
||||
attr_uchar4_offset += size;
|
||||
}
|
||||
|
@ -630,6 +631,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size; k++) {
|
||||
attr_float[offset + k] = data[k];
|
||||
}
|
||||
attr_float.tag_modified();
|
||||
}
|
||||
attr_float_offset += size;
|
||||
}
|
||||
|
@ -642,6 +644,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size; k++) {
|
||||
attr_float2[offset + k] = data[k];
|
||||
}
|
||||
attr_float2.tag_modified();
|
||||
}
|
||||
attr_float2_offset += size;
|
||||
}
|
||||
|
@ -654,6 +657,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size * 3; k++) {
|
||||
attr_float4[offset + k] = (&tfm->x)[k];
|
||||
}
|
||||
attr_float4.tag_modified();
|
||||
}
|
||||
attr_float4_offset += size * 3;
|
||||
}
|
||||
|
@ -666,6 +670,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size; k++) {
|
||||
attr_float4[offset + k] = data[k];
|
||||
}
|
||||
attr_float4.tag_modified();
|
||||
}
|
||||
attr_float4_offset += size;
|
||||
}
|
||||
|
@ -678,6 +683,7 @@ void GeometryManager::update_attribute_element_offset(Geometry *geom,
|
|||
for (size_t k = 0; k < size; k++) {
|
||||
attr_float3[offset + k] = data[k];
|
||||
}
|
||||
attr_float3.tag_modified();
|
||||
}
|
||||
attr_float3_offset += size;
|
||||
}
|
||||
|
|
|
@ -53,19 +53,7 @@ static GPUShader *hair_refine_shader_transform_feedback_create(
|
|||
static GPUShader *hair_refine_shader_transform_feedback_workaround_create(
|
||||
ParticleRefineShader UNUSED(refinement))
|
||||
{
|
||||
GPUShader *sh = NULL;
|
||||
|
||||
char *shader_src = BLI_string_joinN(datatoc_common_hair_lib_glsl,
|
||||
datatoc_common_hair_refine_vert_glsl);
|
||||
sh = DRW_shader_create(shader_src,
|
||||
NULL,
|
||||
datatoc_gpu_shader_3D_smooth_color_frag_glsl,
|
||||
"#define blender_srgb_to_framebuffer_space(a) a\n"
|
||||
"#define HAIR_PHASE_SUBDIV\n"
|
||||
"#define TF_WORKAROUND\n");
|
||||
MEM_freeN(shader_src);
|
||||
|
||||
return sh;
|
||||
return GPU_shader_create_from_info_name("draw_hair_refine_transform_feedback_workaround");
|
||||
}
|
||||
|
||||
GPUShader *DRW_shader_hair_refine_get(ParticleRefineShader refinement,
|
||||
|
|
|
@ -1,13 +1,4 @@
|
|||
|
||||
/* To be compiled with common_hair_lib.glsl */
|
||||
|
||||
out vec4 finalColor;
|
||||
|
||||
#ifdef TF_WORKAROUND
|
||||
uniform int targetWidth;
|
||||
uniform int targetHeight;
|
||||
uniform int idOffset;
|
||||
#endif
|
||||
#pragma BLENDER_REQUIRE(common_hair_lib.glsl)
|
||||
|
||||
void main(void)
|
||||
{
|
||||
|
|
|
@ -24,3 +24,26 @@ GPU_SHADER_CREATE_INFO(draw_hair_refine_compute)
|
|||
.compute_source("common_hair_refine_comp.glsl")
|
||||
.define("HAIR_PHASE_SUBDIV")
|
||||
.do_static_compilation(true);
|
||||
|
||||
GPU_SHADER_INTERFACE_INFO(draw_hair_refine_transform_feedback_workaround_iface, "")
|
||||
.smooth(Type::VEC4, "finalColor");
|
||||
|
||||
GPU_SHADER_CREATE_INFO(draw_hair_refine_transform_feedback_workaround)
|
||||
.define("srgbTarget", "false")
|
||||
.define("blender_srgb_to_framebuffer_space(a)", "a")
|
||||
.define("HAIR_PHASE_SUBDIV")
|
||||
.define("TF_WORKAROUND")
|
||||
|
||||
/* Move these to "draw_hair"? */
|
||||
.sampler(0, ImageType::UINT_BUFFER, "hairStrandBuffer")
|
||||
.sampler(1, ImageType::UINT_BUFFER, "hairStrandSegBuffer")
|
||||
|
||||
.push_constant(Type::INT, "targetWidth")
|
||||
.push_constant(Type::INT, "targetHeight")
|
||||
.push_constant(Type::INT, "idOffset")
|
||||
.vertex_out(draw_hair_refine_transform_feedback_workaround_iface)
|
||||
.fragment_out(0, Type::VEC4, "fragColor")
|
||||
.vertex_source("common_hair_refine_vert.glsl")
|
||||
.fragment_source("gpu_shader_3D_smooth_color_frag.glsl")
|
||||
.additional_info("draw_hair")
|
||||
.do_static_compilation(true);
|
||||
|
|
Loading…
Reference in New Issue