Merge branch 'feature/3-mesh-tessellation' into 'main'

Bind attribute location

See merge request jack/terravisor!4
This commit is contained in:
Jack Christensen 2024-08-29 03:10:24 +00:00
commit 8f6b1de6fc
5 changed files with 56 additions and 22 deletions

View File

@ -30,20 +30,20 @@ DockId=0x00000003,0
[Window][Viewport] [Window][Viewport]
Pos=0,34 Pos=0,34
Size=2134,1641 Size=2178,1641
Collapsed=0 Collapsed=0
DockId=0x00000003,0 DockId=0x00000003,0
[Window][Scene Settings] [Window][Scene Settings]
Pos=2137,34 Pos=2181,34
Size=743,1641 Size=699,1641
Collapsed=0 Collapsed=0
DockId=0x00000004,0 DockId=0x00000004,0
[Docking][Data] [Docking][Data]
DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,34 Size=2880,1641 Split=X Selected=0x9F2D9299 DockSpace ID=0x6F42A598 Window=0xE80F322C Pos=0,34 Size=2880,1641 Split=X Selected=0x9F2D9299
DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=0,0 Split=X Selected=0x13926F0B DockNode ID=0x00000001 Parent=0x6F42A598 SizeRef=0,0 Split=X Selected=0x13926F0B
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=2134,701 CentralNode=1 Selected=0x13926F0B DockNode ID=0x00000003 Parent=0x00000001 SizeRef=578,701 CentralNode=1 Selected=0x13926F0B
DockNode ID=0x00000004 Parent=0x00000001 SizeRef=743,701 Selected=0x413E6147 DockNode ID=0x00000004 Parent=0x00000001 SizeRef=699,701 Selected=0x413E6147
DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=419,701 Selected=0xF69494A7 DockNode ID=0x00000002 Parent=0x6F42A598 SizeRef=419,701 Selected=0xF69494A7

View File

@ -24,21 +24,48 @@ in VS_OUT {
out TC_OUT { out TC_OUT {
vec3 position; vec3 position;
vec2 texCoord; vec2 texCoord;
float tessLevel;
} tc_out[]; } tc_out[];
float getHeight(vec2 uv) {
return texture(heightTexture, uv).r * displacementScale;
}
float calculateSlope() {
float step = 1.0f / (float(gridDensity) * maxTessellation + 1.0f);
// Find surrounding heights
float hLeft = getHeight(tc_in[gl_InvocationID].texCoord + vec2(-step, 0.0f));
float hRight = getHeight(tc_in[gl_InvocationID].texCoord + vec2(step, 0.0f));
float hUp = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, step));
float hDown = getHeight(tc_in[gl_InvocationID].texCoord + vec2(0.0f, -step));
float slopeX = abs(hLeft - hRight) * displacementScale;
float slopeY = abs(hUp - hDown) * displacementScale;
float maxSlope = max(slopeX, slopeY);
return maxSlope;
}
void main() { void main() {
// Pass through position and texture coordinates to the tessellation evaluation shader // Pass through position and texture coordinates to the tessellation evaluation shader
tc_out[gl_InvocationID].position = tc_in[gl_InvocationID].position; tc_out[gl_InvocationID].position = tc_in[gl_InvocationID].position;
tc_out[gl_InvocationID].texCoord = tc_in[gl_InvocationID].texCoord; tc_out[gl_InvocationID].texCoord = tc_in[gl_InvocationID].texCoord;
float slope = calculateSlope();
float tessLevel = tessellationFactor * (1.0f + slope * 10.0f);
tessLevel = max(tessLevel, maxTessellation);
tc_out[gl_InvocationID].tessLevel = tessLevel;
// Set tessellation levels // Set tessellation levels
if (gl_InvocationID == 0) { if (gl_InvocationID == 0) {
gl_TessLevelOuter[0] = maxTessellation; gl_TessLevelOuter[0] = tessLevel;
gl_TessLevelOuter[1] = maxTessellation; gl_TessLevelOuter[1] = tessLevel;
gl_TessLevelOuter[2] = maxTessellation; gl_TessLevelOuter[2] = tessLevel;
gl_TessLevelOuter[3] = maxTessellation; gl_TessLevelOuter[3] = tessLevel;
gl_TessLevelInner[0] = maxTessellation; gl_TessLevelInner[0] = tessLevel;
gl_TessLevelInner[1] = maxTessellation; gl_TessLevelInner[1] = tessLevel;
} }
} }

View File

@ -18,6 +18,7 @@ layout(std140, binding = 4) uniform GeoUniforms
in TC_OUT { in TC_OUT {
vec3 position; vec3 position;
vec2 texCoord; vec2 texCoord;
float tessLevel;
} te_in[]; } te_in[];
out TE_OUT { out TE_OUT {
@ -30,19 +31,25 @@ float getHeight(vec2 uv) {
return texture(heightTexture, uv).r * displacementScale; return texture(heightTexture, uv).r * displacementScale;
} }
float getNeighbor(float tessFactor) {
return (float(gridDensity) * tessFactor + 1.0f);
}
vec3 calculateSmoothNormal(vec3 pos, vec2 coord) { vec3 calculateSmoothNormal(vec3 pos, vec2 coord) {
// Currently hardcoded to match patch density // Currently hardcoded to match patch density
float step = 1.0f / (float(gridDensity) * maxTessellation + 1.0f); //float step = 1.0f / (float(gridDensity) * tessLevel + 1.0f);
float stepU = 1.0f / (float(gridDensity) * gl_TessLevelInner[0]);
float stepV = 1.0f / (float(gridDensity) * gl_TessLevelInner[1]);
// Find surrounding heights // Find surrounding heights
float hLeft = getHeight(coord + vec2(-step, 0.0f)); float hLeft = getHeight(coord + vec2(-stepU, 0.0f));
float hRight = getHeight(coord + vec2(step, 0.0f)); float hRight = getHeight(coord + vec2(stepU, 0.0f));
float hUp = getHeight(coord + vec2(0.0f, step)); float hUp = getHeight(coord + vec2(0.0f, stepV));
float hDown = getHeight(coord + vec2(0.0f, -step)); float hDown = getHeight(coord + vec2(0.0f, -stepV));
// Calculate tangents // Calculate tangents
vec3 tangentX = normalize(vec3(step, hRight - hLeft, 0.0)); vec3 tangentX = normalize(vec3(stepU, hRight - hLeft, 0.0));
vec3 tangentY = normalize(vec3(0.0, hUp - hDown, step)); vec3 tangentY = normalize(vec3(0.0, hUp - hDown, stepV));
return normalize(cross(tangentY, tangentX)); return normalize(cross(tangentY, tangentX));
} }

View File

@ -20,7 +20,6 @@ void ApplyUIScaling(GLFWwindow* window) {
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
io.Fonts->Clear(); io.Fonts->Clear();
std::cout << "Current Path: " << std::filesystem::current_path() << std::endl;
#ifdef _WIN32 #ifdef _WIN32
io.Fonts->AddFontFromFileTTF("imgui/misc/fonts/JetBrainsMono/JetBrainsMono-Medium.ttf", 8.0f * scale); io.Fonts->AddFontFromFileTTF("imgui/misc/fonts/JetBrainsMono/JetBrainsMono-Medium.ttf", 8.0f * scale);

View File

@ -240,8 +240,7 @@ void Scene::Display(GLFWwindow* window) {
glUseProgram(shader_program_); glUseProgram(shader_program_);
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Window* viewport = Interface::GetWindowByName(windows_, "Viewport"); Window* viewport = Interface::GetWindowByName(windows_, "Viewport");
if (viewport && viewport->size.x > 0 && viewport->size.y > 0) { if (viewport && viewport->size.x > 0 && viewport->size.y > 0) {
@ -270,7 +269,9 @@ void Scene::Display(GLFWwindow* window) {
glPatchParameteri(GL_PATCH_VERTICES, 4); glPatchParameteri(GL_PATCH_VERTICES, 4);
glDrawElements(GL_PATCHES, indices.size(), GL_UNSIGNED_INT, 0); glDrawElements(GL_PATCHES, indices.size(), GL_UNSIGNED_INT, 0);
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); FBO::Unbind();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
FBO::Bind(lht_fbo_); FBO::Bind(lht_fbo_);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);