Skip to content

Commit

Permalink
DynamicStrands rendering. (#76)
Browse files Browse the repository at this point in the history
Now DynamicStrands rendering embeds into SDK's render system, supporting PBR material, dynamic lighting, and real-time soft shadows.
  • Loading branch information
edisonlee0212 authored Dec 20, 2024
1 parent b4b5b13 commit 9d20c47
Show file tree
Hide file tree
Showing 31 changed files with 953 additions and 247 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ void SorghumPointCloudScanner::Scan(const std::shared_ptr<PointCloudCaptureSetti
* mesh, material changes.
*/
std::shared_ptr<RenderInstanceStorage> render_instances;
render_instances = render_layer->GetCurrentRenderInstances();
render_instances = render_layer->GetCurrentRenderInstanceStorage();
CpuRayTracer cpu_ray_tracer;
/**
* During this step, the cpu_ray_tracer will scan all MeshRendereres in the scene, and establish TLAS and BLAS based
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include "DynamicStrandsRenderingConstants.glsl"

#include "PerFrame.glsl"
#define EE_PER_GROUP_SET 1
#define EE_PER_GROUP_SET 2
#include "Lighting.glsl"

layout (location = 0) in VS_OUT {
Expand All @@ -17,48 +17,44 @@ layout (location = 0) in VS_OUT {

layout (location = 0) out vec4 out_color;

layout(location = 5) in flat uint currentInstanceIndex;

void main(){
/*
uint instanceIndex = currentInstanceIndex;
MaterialProperties materialProperties = EE_MATERIAL_PROPERTIES[EE_INSTANCES[instanceIndex].material_index];
vec2 tex_coord = fs_in.TexCoord;
MaterialProperties materialProperties = EE_MATERIAL_PROPERTIES[base_index];
vec2 materialTexCoord = fs_in.TexCoord;
vec4 albedo = materialProperties.albedo;
if (materialProperties.albedo_map_index != -1)
albedo = texture(EE_TEXTURE_2DS[materialProperties.albedo_map_index], tex_coord);
if (albedo.a <= 0.5) discard;
albedo = texture(EE_TEXTURE_2DS[materialProperties.albedo_map_index], materialTexCoord);
if (albedo.a <= 0.1f) discard;
vec3 normal = fs_in.Normal;
vec3 fragPos = fs_in.FragPos;

if (materialProperties.normal_map_index != -1){
vec3 B = cross(fs_in.Normal, fs_in.Tangent);
mat3 TBN = mat3(fs_in.Tangent, B, fs_in.Normal);
normal = texture(EE_TEXTURE_2DS[materialProperties.normal_map_index], tex_coord).rgb;
normal = normal * 2.0 - 1.0;
normal = texture(EE_TEXTURE_2DS[materialProperties.normal_map_index], materialTexCoord).rgb;
normal = normal * 2.0f - 1.0f;
normal = normalize(TBN * normal);
}

float roughness = materialProperties.roughness;
float metallic = materialProperties.metallic;
float emission = materialProperties.emission;
float ao = materialProperties.ambient_occulusion;
vec4 albedo = materialProperties.albedo;

if (materialProperties.roughness_map_index != -1) roughness = texture(EE_TEXTURE_2DS[materialProperties.roughness_map_index], materialTexCoord).r;
if (materialProperties.metallic_map_index != -1) metallic = texture(EE_TEXTURE_2DS[materialProperties.metallic_map_index], materialTexCoord).r;
if (materialProperties.ao_texture_index != -1) ao = texture(EE_TEXTURE_2DS[materialProperties.ao_texture_index], materialTexCoord).r;
if (materialProperties.albedo_map_index != -1) albedo = texture(EE_TEXTURE_2DS[materialProperties.albedo_map_index], materialTexCoord);

vec3 cameraPosition = EE_CAMERA_POSITION(EE_CAMERA_INDEX);
float dist = distance(fs_in.FragPos, cameraPosition);

vec3 cameraPosition = EE_CAMERA_POSITION(EE_CAMERA_INDEX);
vec3 viewDir = normalize(cameraPosition - fragPos);
bool receiveShadow = true;
vec3 F0 = vec3(0.04);
vec3 F0 = vec3(0.04f);
F0 = mix(F0, albedo.xyz, metallic);
vec3 result = EE_FUNC_CALCULATE_LIGHTS(receiveShadow, albedo.xyz, 1.0, depth, normal, viewDir, fragPos, metallic, roughness, F0);
vec3 result = EE_FUNC_CALCULATE_LIGHTS(receiveShadow, albedo.xyz, 1.0f, dist, normal, viewDir, fragPos, metallic, roughness, F0);
vec3 ambient = EE_FUNC_CALCULATE_ENVIRONMENTAL_LIGHT(albedo.xyz, normal, viewDir, metallic, roughness, F0);
vec3 color = result + emission * normalize(albedo.xyz) + ambient * ao;
color = pow(color, vec3(1.0 / EE_RENDER_INFO.gamma));
*/
out_color = vec4(fs_in.Color);
out_color = vec4(pow(color, vec3(1.0f / EE_RENDER_INFO.gamma)), albedo.a);

//out_color = vec4(fs_in.Color);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
void main()
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#extension GL_EXT_mesh_shader : enable
#extension GL_ARB_shader_draw_parameters : enable
#extension GL_EXT_control_flow_attributes : require
#extension GL_ARB_shading_language_include : enable
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require
#extension GL_EXT_shader_atomic_float : require

#include "PerFrame.glsl"

#define DYNAMIC_STRANDS_SET 1
#include "DynamicStrands.glsl"

const uint WORKGROUP_SIZE = EXT_MESH_SUBGROUP_COUNT * SUBGROUP_SIZE;

layout(local_size_x = WORKGROUP_SIZE) in;
layout(triangles) out;

#define TETRAHEDRON_VERTICES_SIZE 4
#define TETRAHEDRON_TRIANGLE_SIZE 4

layout(max_vertices = TETRAHEDRON_VERTICES_SIZE, max_primitives = TETRAHEDRON_TRIANGLE_SIZE) out;

const uint TETRAHEDRON_VERTEX_ITERATIONS = ((TETRAHEDRON_VERTICES_SIZE + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE);
const uint TETRAHEDRON_PRIMITIVE_ITERATIONS = ((TETRAHEDRON_TRIANGLE_SIZE + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE);

layout(location = 0) out MS_V_OUT {
vec3 FragPos;
vec3 Normal;
vec3 Tangent;
vec2 TexCoord;
vec4 Color;
} ms_v_out[];

struct Task{
uint baseID;
uint8_t deltaIDs[EXT_TASK_WORK_GROUP_INVOCATIONS];
};

// order them such that the triangle index corresponds to the vertex index on the opposing side
uvec3 triangles[] = {
uvec3(2, 1, 3),
uvec3(0, 2, 3),
uvec3(1, 0, 3),
uvec3(0, 1, 2),
};

#define BARRIER() \
memoryBarrierShared(); \
barrier();

taskPayloadSharedEXT Task ts_in;

// gl_WorkGroupID.x runs from [0 .. parentTask.groupCountX - 1]
uint tet_id = ts_in.baseID + ts_in.deltaIDs[gl_WorkGroupID.x];
uint laneID = gl_LocalInvocationID.x;


#include "AlphaShape.glsl"

void main(){

// report amount of accepted triangles
SetMeshOutputsEXT(TETRAHEDRON_VERTICES_SIZE, delaunay_tetrahedrons[tet_id].triangles_accepted);
DelaunayTetrahedron tet = delaunay_tetrahedrons[tet_id];
// set up vertex properties
mat4 transform = EE_DIRECTIONAL_LIGHTS[EE_CAMERA_INDEX].light_space_matrix[base_index];

[[unroll]]
for (uint i = 0; i < uint(TETRAHEDRON_VERTEX_ITERATIONS); ++i)
{
uint vertex_index = laneID + i * WORKGROUP_SIZE;
if (vertex_index >= TETRAHEDRON_VERTICES_SIZE) break;
vec3 vertex_position = uniform_particles[tet.indices[vertex_index]].position_t.xyz;
vec3 vertex_normal = normalize(uniform_particles[tet.indices[vertex_index]].normal_deg.xyz);

ms_v_out[vertex_index].FragPos = vertex_position;
ms_v_out[vertex_index].Normal = vertex_normal;
ms_v_out[vertex_index].Tangent = uniform_particles[tet.indices[vertex_index]].tangent.xyz;
ms_v_out[vertex_index].TexCoord = vec2(uniform_particles[tet.indices[vertex_index]].tex_coord.x, uniform_particles[tet.indices[vertex_index]].tex_coord.y);
if(vertex_colors == 0){
ms_v_out[vertex_index].Color = vec4(0.5, 0.5, 0.5, 1.0);
} else if(vertex_colors == 1){
ms_v_out[vertex_index].Color = vec4(abs(vertex_normal.xyz), 1.0f);
} else if(vertex_colors == 2){
ms_v_out[vertex_index].Color = vec4(abs(uniform_particles[tet.indices[vertex_index]].tangent.xyz), 1.0f);
} else if(vertex_colors == 3){
ms_v_out[vertex_index].Color = vec4(mod(uniform_particles[tet.indices[vertex_index]].tex_coord.x, 1.0f),
mod(uniform_particles[tet.indices[vertex_index]].tex_coord.y, 1.0f),
mod(uniform_particles[tet.indices[vertex_index]].tex_coord.z, 1.0f), 1.0f);
}

gl_MeshVerticesEXT[vertex_index].gl_Position = transform * vec4(vertex_position, 1.0);
}

// assign all accepted triangles
[[unroll]]
for (uint i = 0; i < uint(TETRAHEDRON_PRIMITIVE_ITERATIONS); ++i)
{
uint triangle_index = laneID + i * WORKGROUP_SIZE;
if(triangle_index < TETRAHEDRON_TRIANGLE_SIZE){

if(delaunay_tetrahedrons[tet_id].render_neighbor[triangle_index] == 1){

// count triangles downwards
int index = atomicAdd(delaunay_tetrahedrons[tet_id].triangles_accepted, -1);
gl_PrimitiveTriangleIndicesEXT[index - 1] = triangles[triangle_index];
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
#extension GL_EXT_mesh_shader : enable
#extension GL_ARB_shader_draw_parameters : enable
#extension GL_EXT_control_flow_attributes : require
#extension GL_ARB_shading_language_include : enable
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require
#extension GL_EXT_shader_atomic_float : require

#include "PerFrame.glsl"

#define DYNAMIC_STRANDS_SET 1
#include "DynamicStrands.glsl"

const uint WORKGROUP_SIZE = EXT_MESH_SUBGROUP_COUNT * SUBGROUP_SIZE;

layout(local_size_x = WORKGROUP_SIZE) in;
layout(triangles) out;

#define TETRAHEDRON_VERTICES_SIZE 4
#define TETRAHEDRON_TRIANGLE_SIZE 4

layout(max_vertices = TETRAHEDRON_VERTICES_SIZE, max_primitives = TETRAHEDRON_TRIANGLE_SIZE) out;

const uint TETRAHEDRON_VERTEX_ITERATIONS = ((TETRAHEDRON_VERTICES_SIZE + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE);
const uint TETRAHEDRON_PRIMITIVE_ITERATIONS = ((TETRAHEDRON_TRIANGLE_SIZE + WORKGROUP_SIZE - 1) / WORKGROUP_SIZE);

layout(location = 0) out MS_V_OUT {
vec3 FragPos;
vec3 Normal;
vec3 Tangent;
vec2 TexCoord;
vec4 Color;
} ms_v_out[];

struct Task{
uint baseID;
uint8_t deltaIDs[EXT_TASK_WORK_GROUP_INVOCATIONS];
};

// order them such that the triangle index corresponds to the vertex index on the opposing side
uvec3 triangles[] = {
uvec3(2, 1, 3),
uvec3(0, 2, 3),
uvec3(1, 0, 3),
uvec3(0, 1, 2),
};

#define BARRIER() \
memoryBarrierShared(); \
barrier();

taskPayloadSharedEXT Task ts_in;

// gl_WorkGroupID.x runs from [0 .. parentTask.groupCountX - 1]
uint tet_id = ts_in.baseID + ts_in.deltaIDs[gl_WorkGroupID.x];
uint laneID = gl_LocalInvocationID.x;


#include "AlphaShape.glsl"

void main(){

// report amount of accepted triangles
SetMeshOutputsEXT(TETRAHEDRON_VERTICES_SIZE, delaunay_tetrahedrons[tet_id].triangles_accepted);
DelaunayTetrahedron tet = delaunay_tetrahedrons[tet_id];
// set up vertex properties
mat4 transform = EE_POINT_LIGHTS[EE_CAMERA_INDEX].light_space_matrix[base_index];

[[unroll]]
for (uint i = 0; i < uint(TETRAHEDRON_VERTEX_ITERATIONS); ++i)
{
uint vertex_index = laneID + i * WORKGROUP_SIZE;
if (vertex_index >= TETRAHEDRON_VERTICES_SIZE) break;
vec3 vertex_position = uniform_particles[tet.indices[vertex_index]].position_t.xyz;
vec3 vertex_normal = normalize(uniform_particles[tet.indices[vertex_index]].normal_deg.xyz);

ms_v_out[vertex_index].FragPos = vertex_position;
ms_v_out[vertex_index].Normal = vertex_normal;
ms_v_out[vertex_index].Tangent = uniform_particles[tet.indices[vertex_index]].tangent.xyz;
ms_v_out[vertex_index].TexCoord = vec2(uniform_particles[tet.indices[vertex_index]].tex_coord.x, uniform_particles[tet.indices[vertex_index]].tex_coord.y);
if(vertex_colors == 0){
ms_v_out[vertex_index].Color = vec4(0.5, 0.5, 0.5, 1.0);
} else if(vertex_colors == 1){
ms_v_out[vertex_index].Color = vec4(abs(vertex_normal.xyz), 1.0f);
} else if(vertex_colors == 2){
ms_v_out[vertex_index].Color = vec4(abs(uniform_particles[tet.indices[vertex_index]].tangent.xyz), 1.0f);
} else if(vertex_colors == 3){
ms_v_out[vertex_index].Color = vec4(mod(uniform_particles[tet.indices[vertex_index]].tex_coord.x, 1.0f),
mod(uniform_particles[tet.indices[vertex_index]].tex_coord.y, 1.0f),
mod(uniform_particles[tet.indices[vertex_index]].tex_coord.z, 1.0f), 1.0f);
}

gl_MeshVerticesEXT[vertex_index].gl_Position = transform * vec4(vertex_position, 1.0);
}

// assign all accepted triangles
[[unroll]]
for (uint i = 0; i < uint(TETRAHEDRON_PRIMITIVE_ITERATIONS); ++i)
{
uint triangle_index = laneID + i * WORKGROUP_SIZE;
if(triangle_index < TETRAHEDRON_TRIANGLE_SIZE){

if(delaunay_tetrahedrons[tet_id].render_neighbor[triangle_index] == 1){

// count triangles downwards
int index = atomicAdd(delaunay_tetrahedrons[tet_id].triangles_accepted, -1);
gl_PrimitiveTriangleIndicesEXT[index - 1] = triangles[triangle_index];
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

#include "PerFrame.glsl"

#define DYNAMIC_STRANDS_SET 2
#define DYNAMIC_STRANDS_SET 1
#include "DynamicStrands.glsl"

const uint WORKGROUP_SIZE = EXT_MESH_SUBGROUP_COUNT * SUBGROUP_SIZE;
Expand All @@ -32,7 +32,6 @@ layout(location = 0) out MS_V_OUT {
} ms_v_out[];

struct Task{
uint instanceIndex;
uint baseID;
uint8_t deltaIDs[EXT_TASK_WORK_GROUP_INVOCATIONS];
};
Expand All @@ -55,8 +54,6 @@ taskPayloadSharedEXT Task ts_in;
uint tet_id = ts_in.baseID + ts_in.deltaIDs[gl_WorkGroupID.x];
uint laneID = gl_LocalInvocationID.x;

layout(location = 5) out flat uint currentInstanceIndex[];

#include "AlphaShape.glsl"

void main(){
Expand Down Expand Up @@ -92,7 +89,6 @@ void main(){
}

gl_MeshVerticesEXT[vertex_index].gl_Position = transform * vec4(vertex_position, 1.0);
currentInstanceIndex[vertex_index] = ts_in.instanceIndex;
}

// assign all accepted triangles
Expand Down
Loading

0 comments on commit 9d20c47

Please sign in to comment.