From b95586db2bc777ed8f761ece7ae95c842555f684 Mon Sep 17 00:00:00 2001 From: wuyize Date: Wed, 27 Jul 2022 18:09:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=82=B9=E4=B9=98=E8=AE=A1?= =?UTF-8?q?=E7=AE=97cos>1=E5=BC=95=E8=B5=B7=E7=9A=84=E5=99=AA=E7=82=B9?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E9=BC=A0=E6=A0=87=E6=BB=9A=E8=BD=AE?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E8=A7=86=E9=87=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ArchitectureColoredPainting/Camera.cpp | 6 +- .../RendererWidget.cpp | 41 +- ArchitectureColoredPainting/RendererWidget.h | 2 + .../Shaders/final.frag | 12 +- .../Shaders/final.vert | 2 +- .../Shaders/model.frag | 4 +- .../Shaders/model.vert | 2 +- .../Shaders/painting.frag | 485 +++++++++++++++++- .../Shaders/painting.vert | 2 +- 9 files changed, 522 insertions(+), 34 deletions(-) diff --git a/ArchitectureColoredPainting/Camera.cpp b/ArchitectureColoredPainting/Camera.cpp index 1504611..23703e6 100644 --- a/ArchitectureColoredPainting/Camera.cpp +++ b/ArchitectureColoredPainting/Camera.cpp @@ -72,11 +72,11 @@ void Camera::ProcessMouseMovement(float xoffset, float yoffset, GLboolean constr // processes input received from a mouse scroll-wheel event. Only requires input on the vertical wheel-axis void Camera::ProcessMouseScroll(float yoffset) { - Zoom -= (float)yoffset; + Zoom -= (float)yoffset*Zoom/60.; if (Zoom < 1.0f) Zoom = 1.0f; - if (Zoom > 45.0f) - Zoom = 45.0f; + if (Zoom > 75.0f) + Zoom = 75.0f; } // calculates the front vector from the Camera's (updated) Euler Angles diff --git a/ArchitectureColoredPainting/RendererWidget.cpp b/ArchitectureColoredPainting/RendererWidget.cpp index 918d9c0..befee22 100644 --- a/ArchitectureColoredPainting/RendererWidget.cpp +++ b/ArchitectureColoredPainting/RendererWidget.cpp @@ -10,7 +10,6 @@ RendererWidget::RendererWidget(QWidget* parent) startTimer(1000 / 120); lastFrame = std::clock(); setFocusPolicy(Qt::StrongFocus); - } RendererWidget::~RendererWidget() @@ -41,8 +40,9 @@ RendererWidget::~RendererWidget() void RendererWidget::initializeGL() { - initializeOpenGLFunctions(); + qDebug() << "GL_VERSION" << (char*)glGetString(GL_VERSION); + glEnable(GL_DEPTH_TEST); glClearColor(0, 0, 0, 1); @@ -113,13 +113,18 @@ void RendererWidget::paintGL() if (fboPtr->bind()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + QMatrix4x4 projection; + projection.perspective(camera.Zoom, (float)width() / (float)height(), 10.f, 10000.0f); QMatrix4x4 view = camera.GetViewMatrix(); modelProgramPtr->bind(); + modelProgramPtr->setUniformValue("projection", projection); modelProgramPtr->setUniformValue("view", view); modelProgramPtr->release(); paintingProgramPtr->bind(); + paintingProgramPtr->setUniformValue("projection", projection); paintingProgramPtr->setUniformValue("view", view); paintingProgramPtr->release(); + model->draw(); fboPtr->release(); } @@ -161,19 +166,9 @@ void RendererWidget::resizeGL(int width, int height) fboPtr->addColorAttachment(devicePixelRatio() * width, devicePixelRatio() * height, GL_RG); GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 }; glDrawBuffers(4, attachments); - if (fboPtr->bind()) - { - QMatrix4x4 projection; - projection.perspective(camera.Zoom, (float)width / (float)height, 10.f, 10000.0f); - modelProgramPtr->bind(); - modelProgramPtr->setUniformValue("projection", projection); - modelProgramPtr->release(); - paintingProgramPtr->bind(); - paintingProgramPtr->setUniformValue("projection", projection); - paintingProgramPtr->release(); - fboPtr->release(); - } - + + + std::cout << "\033[?25l"; } void RendererWidget::timerEvent(QTimerEvent* event) @@ -182,6 +177,18 @@ void RendererWidget::timerEvent(QTimerEvent* event) deltaTime = (float)(std::clock() - lastFrame) / CLOCKS_PER_SEC; lastFrame = currentFrame; + + static float accTime = 0,frameCnt = 0; + accTime += deltaTime; + frameCnt++; + if (accTime > 1.) + { + std::cout << "FPS: " << frameCnt / accTime << "\r"; + accTime = 0; + frameCnt = 0; + } + + if (hasFocus()) { QPoint center = mapToGlobal(geometry().center()); @@ -228,6 +235,10 @@ void RendererWidget::keyReleaseEvent(QKeyEvent* event) QOpenGLWidget::keyReleaseEvent(event); } +void RendererWidget::wheelEvent(QWheelEvent* event) +{ + camera.ProcessMouseScroll(event->delta()/15.); +} void RendererWidget::focusInEvent(QFocusEvent* event) { diff --git a/ArchitectureColoredPainting/RendererWidget.h b/ArchitectureColoredPainting/RendererWidget.h index ba6d4cc..c227506 100644 --- a/ArchitectureColoredPainting/RendererWidget.h +++ b/ArchitectureColoredPainting/RendererWidget.h @@ -24,8 +24,10 @@ protected: void timerEvent(QTimerEvent* event) override; void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; + void wheelEvent(QWheelEvent* event) override; void focusInEvent(QFocusEvent* event) override; void focusOutEvent(QFocusEvent* event) override; + private: QSet pressedKeys; Camera camera; diff --git a/ArchitectureColoredPainting/Shaders/final.frag b/ArchitectureColoredPainting/Shaders/final.frag index d2fd4b4..1616f9b 100644 --- a/ArchitectureColoredPainting/Shaders/final.frag +++ b/ArchitectureColoredPainting/Shaders/final.frag @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core out vec4 FragColor; @@ -59,11 +59,11 @@ vec3 fresnelSchlick(float cosTheta, vec3 F0) void main() { vec3 albedo = pow(texture(gBaseColor, TexCoords).rgb, vec3(2.2)); - float metallic = texture(gMetallicRoughness, TexCoords).g; - float roughness = texture(gMetallicRoughness, TexCoords).r; + float metallic = texture(gMetallicRoughness, TexCoords).r; + float roughness = texture(gMetallicRoughness, TexCoords).g; - vec3 N = texture(gNormal, TexCoords).xyz; + vec3 N = normalize(texture(gNormal, TexCoords).xyz); vec3 WorldPos = texture(gPosition, TexCoords).xyz; vec3 V = normalize(camPos - WorldPos); @@ -84,8 +84,8 @@ void main() // cook-torrance brdf float NDF = DistributionGGX(N, H, roughness); float G = GeometrySmith(N, V, L, roughness); - vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0); - F = clamp(F,vec3(0),vec3(1)); + vec3 F = fresnelSchlick(clamp(dot(H, V),0.,1.), F0); + //F = clamp(F,vec3(0),vec3(1)); vec3 kS = F; vec3 kD = vec3(1.0) - kS; diff --git a/ArchitectureColoredPainting/Shaders/final.vert b/ArchitectureColoredPainting/Shaders/final.vert index 9988a20..6317aab 100644 --- a/ArchitectureColoredPainting/Shaders/final.vert +++ b/ArchitectureColoredPainting/Shaders/final.vert @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoords; diff --git a/ArchitectureColoredPainting/Shaders/model.frag b/ArchitectureColoredPainting/Shaders/model.frag index 594331a..bbd4400 100644 --- a/ArchitectureColoredPainting/Shaders/model.frag +++ b/ArchitectureColoredPainting/Shaders/model.frag @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core uniform sampler2D texture_basecolor; @@ -41,7 +41,7 @@ void main() discard; gPosition = WorldPos; gNormal = getNormalFromMap(); - gMetallicRoughness = texture(texture_metallic_roughness, TexCoords).gb; + gMetallicRoughness = texture(texture_metallic_roughness, TexCoords).bg; } \ No newline at end of file diff --git a/ArchitectureColoredPainting/Shaders/model.vert b/ArchitectureColoredPainting/Shaders/model.vert index 8e2587b..f294dc6 100644 --- a/ArchitectureColoredPainting/Shaders/model.vert +++ b/ArchitectureColoredPainting/Shaders/model.vert @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; diff --git a/ArchitectureColoredPainting/Shaders/painting.frag b/ArchitectureColoredPainting/Shaders/painting.frag index 2ac91c6..ff6fbce 100644 --- a/ArchitectureColoredPainting/Shaders/painting.frag +++ b/ArchitectureColoredPainting/Shaders/painting.frag @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core layout (location = 0) out vec4 gBaseColor; layout (location = 1) out vec3 gNormal; @@ -9,10 +9,485 @@ in vec2 TexCoords; in vec3 WorldPos; in vec3 Normal; + + +//////////////////////////////////////////////////////////////////////////// + +float border; + +mat2 inv(mat2 m){ + return mat2(m[1][1],-m[0][1],-m[1][0],m[0][0])/(m[0][0]*m[1][1]-m[1][0]*m[0][1]); +} + +float abs_min(float a, float b){ + if(abs(a)dot(tang,p1)){ + return distance(p1,uv); + } + else{ + return dot(nor,uv)-dot(nor,p0); + } +} + +bool int_test(vec2 uv, vec2 last_point, vec2 p0, vec2 p1){ + last_point-=uv; + p0-=uv; + p1-=uv; + + bool ret; + if(p0.y==0.){ + ret=(p0.x>=0. && p1.y*last_point.y<0.); + } + else if(p1.y==0.){ + ret=false; + } + else if(p0.y*p1.y<0.){ + if(p0.x>=0. && p1.x>=0.){ + ret=true; + } + else if (p0.x<0. && p1.x<0.){ + ret=false; + } + else{ + vec2 nor; + if(p0.y>p1.y){ + nor=p0-p1; + } + else{ + nor=p1-p0; + } + + nor=vec2(nor.y,-nor.x); + if(dot(nor,p0)<0.){ + ret=false; + } + else{ + ret=true; + } + } + } + else{ + ret=false; + } + + return ret; +} + +bool tri_test(vec2 uv, vec2 p0, vec2 p1, vec2 p2, bool inside){ + vec2 nor1=normalize(p0-p1); + nor1=vec2(nor1.y,-nor1.x); + vec2 nor2=normalize(p1-p2); + nor2=vec2(nor2.y,-nor2.x); + vec2 tan3=normalize(p2-p0); + vec2 nor3=vec2(tan3.y,-tan3.x); + + if(inside){ + if(dot(tan3,p0)>=dot(tan3,uv) || dot(tan3,p2)<=dot(tan3,uv)){ + return false; + } + + float brd=max(dot(nor3,nor1),dot(nor3,nor2))*border; + return (dot(uv,nor1)>=dot(p0,nor1) && dot(uv,nor2)>=dot(p1,nor2) && dot(uv,nor3)>=dot(p2,nor3)+brd) || + (dot(uv,nor1)<=dot(p0,nor1) && dot(uv,nor2)<=dot(p1,nor2) && dot(uv,nor3)<=dot(p2,nor3)-brd); + } + else{ + float brd1=dot(nor1,tan3)*border; + float brd2=dot(nor2,tan3)*border; + + if(dot(tan3,p0)>=dot(tan3,uv)-brd1 || dot(tan3,p2)<=dot(tan3,uv)-brd2){ + return false; + } + return (dot(uv,nor1)>=dot(p0,nor1)-border && dot(uv,nor2)>=dot(p1,nor2)-border && dot(uv,nor3)>=dot(p2,nor3)) || + (dot(uv,nor1)<=dot(p0,nor1)+border && dot(uv,nor2)<=dot(p1,nor2)+border && dot(uv,nor3)<=dot(p2,nor3)); + } + +} + +float bezier_sd(vec2 uv, vec2 p0, vec2 p1, vec2 p2){ + + const mat2 trf1 = mat2(-1, 2, 1, 2); + mat2 trf2 = inv(mat2(p0-p1, p2-p1)); + mat2 trf=trf1*trf2; + + uv-=p1; + vec2 xy=trf*uv; + xy.y-=1.; + + vec2 gradient; + gradient.x=2.*trf[0][0]*(trf[0][0]*uv.x+trf[1][0]*uv.y)-trf[0][1]; + gradient.y=2.*trf[1][0]*(trf[0][0]*uv.x+trf[1][0]*uv.y)-trf[1][1]; + + return (xy.x*xy.x-xy.y)/length(gradient); +} + + +float render_serif(vec2 uv){ + + uv.y-=.5; + uv*=1.8; + border*=1.8; + uv.y+=.5; + + uv.x+=.1; + + float d = 1e38; + float poly_d = 1e38; + float d1 = 1e38; + + vec2 p0,p1,p2; + /* + if(all(lessThan(abs(uv-vec2(-1.29705090246,0.49556210191)),vec2(0.203622751405,0.194877434267)+vec2(border)))){ + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.50067365386,0.690439536177),vec2(-1.50067365386,0.662506649919))); + d1=abs_min(d1,line_dist(uv,vec2(-1.34847869375,0.690439536177),vec2(-1.50067365386,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.34847869375,0.662506649919),vec2(-1.34847869375,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.50067365386,0.662506649919),vec2(-1.34847869375,0.662506649919))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.50067365386,0.328356479174),vec2(-1.50067365386,0.300684667642))); + d1=abs_min(d1,line_dist(uv,vec2(-1.50067365386,0.300684667642),vec2(-1.34847869375,0.300684667642))); + d1=abs_min(d1,line_dist(uv,vec2(-1.34847869375,0.300684667642),vec2(-1.34847869375,0.328356479174))); + d1=abs_min(d1,line_dist(uv,vec2(-1.34847869375,0.328356479174),vec2(-1.50067365386,0.328356479174))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.24562309793,0.328356479174),vec2(-1.24562309793,0.300684667642))); + d1=abs_min(d1,line_dist(uv,vec2(-1.09342815105,0.328356479174),vec2(-1.24562309793,0.328356479174))); + d1=abs_min(d1,line_dist(uv,vec2(-1.09342815105,0.300684667642),vec2(-1.09342815105,0.328356479174))); + d1=abs_min(d1,line_dist(uv,vec2(-1.24562309793,0.300684667642),vec2(-1.09342815105,0.300684667642))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.24562309793,0.690439536177),vec2(-1.24562309793,0.662506649919))); + d1=abs_min(d1,line_dist(uv,vec2(-1.09342815105,0.690439536177),vec2(-1.24562309793,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.09342815105,0.662506649919),vec2(-1.09342815105,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.24562309793,0.662506649919),vec2(-1.09342815105,0.662506649919))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.45107323965,0.300684667642),vec2(-1.39807911127,0.300684667642))); + d1=abs_min(d1,line_dist(uv,vec2(-1.39807911127,0.300684667642),vec2(-1.39807911127,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.39807911127,0.690439536177),vec2(-1.45107323965,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.45107323965,0.690439536177),vec2(-1.45107323965,0.300684667642))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.45107323965,0.527802348895),vec2(-1.45107323965,0.495953672637))); + d1=abs_min(d1,line_dist(uv,vec2(-1.45107323965,0.495953672637),vec2(-1.14302855203,0.495953672637))); + d1=abs_min(d1,line_dist(uv,vec2(-1.14302855203,0.495953672637),vec2(-1.14302855203,0.527802348895))); + d1=abs_min(d1,line_dist(uv,vec2(-1.14302855203,0.527802348895),vec2(-1.45107323965,0.527802348895))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.19602268041,0.300684667642),vec2(-1.14302855203,0.300684667642))); + d1=abs_min(d1,line_dist(uv,vec2(-1.14302855203,0.300684667642),vec2(-1.14302855203,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.14302855203,0.690439536177),vec2(-1.19602268041,0.690439536177))); + d1=abs_min(d1,line_dist(uv,vec2(-1.19602268041,0.690439536177),vec2(-1.19602268041,0.300684667642))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + } + */ + if(all(lessThan(abs(uv-vec2(-0.905207605282,0.43943531671)),vec2(0.131571631799,0.146321237064)+vec2(border)))){ + p0=vec2(-0.980652472562,0.432256320122);p1=vec2(-0.980652472562,0.376129514241);p2=vec2(-0.959444621888,0.347459653556); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.959444621888,0.347459653556);p1=vec2(-0.938361593128,0.318958533541);p2=vec2(-0.897114929876,0.318958533541); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.897114929876,0.318958533541);p1=vec2(-0.865527286983,0.318958533541);p2=vec2(-0.845437632053,0.335419078254); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.845437632053,0.335419078254);p1=vec2(-0.825063806547,0.352112459345);p2=vec2(-0.81697111046,0.384744318419); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.778334987661,0.384744318419);p1=vec2(-0.789821407019,0.339059715715);p2=vec2(-0.82088690046,0.316086918361); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.82088690046,0.316086918361);p1=vec2(-0.851691401898,0.293114079646);p2=vec2(-0.902074977419,0.293114079646); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.902074977419,0.293114079646);p1=vec2(-0.962900714754,0.293114079646);p2=vec2(-0.999970513281,0.333055493352); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.999970513281,0.333055493352);p1=vec2(-1.03677923708,0.373257899062);p2=vec2(-1.03677923708,0.439565833392); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-1.03677923708,0.439565833392);p1=vec2(-1.03677923708,0.505351659632);p2=vec2(-1.00049262137,0.545554106703); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-1.00049262137,0.545554106703);p1=vec2(-0.964206005662,0.585756553774);p2=vec2(-0.905207625963,0.585756553774); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.905207625963,0.585756553774);p1=vec2(-0.842293414903,0.585756553774);p2=vec2(-0.808617339647,0.546859356249); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.808617339647,0.546859356249);p1=vec2(-0.774941264391,0.508223274812);p2=vec2(-0.773635973483,0.434344752485); + if(tri_test(uv, p0, p1, p2, false)){ + d=min(d,bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.830284887455,0.462016564017);p1=vec2(-0.831851211727,0.510572740539);p2=vec2(-0.850763015272,0.535223303252); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.850763015272,0.535223303252);p1=vec2(-0.869704151709,0.559912099879);p2=vec2(-0.905207625963,0.559912099879); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.905207625963,0.559912099879);p1=vec2(-0.938361593128,0.559912099879);p2=vec2(-0.957418587479,0.535111893535); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + p0=vec2(-0.957418587479,0.535111893535);p1=vec2(-0.976475566475,0.510311707175);p2=vec2(-0.980652472562,0.462016564017); + if(tri_test(uv, p0, p1, p2, true)){ + d=min(d,-bezier_sd(uv, p0, p1, p2)); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.966462321887,0.559912099879),vec2(-0.841030169481,0.559912099879))); + d1=abs_min(d1,line_dist(uv,vec2(-0.905207625963,0.585756553774),vec2(-0.966462321887,0.559912099879))); + d1=abs_min(d1,line_dist(uv,vec2(-0.841030169481,0.559912099879),vec2(-0.905207625963,0.585756553774))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.82088690046,0.316086918361),vec2(-0.81910715467,0.318958533541))); + d1=abs_min(d1,line_dist(uv,vec2(-0.81910715467,0.318958533541),vec2(-0.965419171536,0.318958533541))); + d1=abs_min(d1,line_dist(uv,vec2(-0.965419171536,0.318958533541),vec2(-0.902074977419,0.293114079646))); + d1=abs_min(d1,line_dist(uv,vec2(-0.902074977419,0.293114079646),vec2(-0.82088690046,0.316086918361))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.773817587078,0.434928897242),vec2(-0.808617339647,0.546859356249))); + d1=abs_min(d1,line_dist(uv,vec2(-0.808617339647,0.546859356249),vec2(-0.882523641701,0.576621645388))); + d1=abs_min(d1,line_dist(uv,vec2(-0.882523641701,0.576621645388),vec2(-0.773817587078,0.434928897242))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.81697111046,0.384744318419),vec2(-0.834987634664,0.312096998846))); + d1=abs_min(d1,line_dist(uv,vec2(-0.834987634664,0.312096998846),vec2(-0.82088690046,0.316086918361))); + d1=abs_min(d1,line_dist(uv,vec2(-0.82088690046,0.316086918361),vec2(-0.778334987661,0.384744318419))); + d1=abs_min(d1,line_dist(uv,vec2(-0.778334987661,0.384744318419),vec2(-0.81697111046,0.384744318419))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.82088690046,0.316086918361),vec2(-0.778334987661,0.384744318419))); + d1=abs_min(d1,line_dist(uv,vec2(-0.778334987661,0.384744318419),vec2(-0.785237494603,0.384744318419))); + d1=abs_min(d1,line_dist(uv,vec2(-0.785237494603,0.384744318419),vec2(-0.894429408392,0.295277456717))); + d1=abs_min(d1,line_dist(uv,vec2(-0.894429408392,0.295277456717),vec2(-0.82088690046,0.316086918361))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.829392250654,0.434344752485),vec2(-0.773635973483,0.434344752485))); + d1=abs_min(d1,line_dist(uv,vec2(-0.833342939816,0.556816429474),vec2(-0.829392250654,0.434344752485))); + d1=abs_min(d1,line_dist(uv,vec2(-0.808617339647,0.546859356249),vec2(-0.833342939816,0.556816429474))); + d1=abs_min(d1,line_dist(uv,vec2(-0.773635973483,0.434344752485),vec2(-0.808617339647,0.546859356249))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.00049262137,0.545554106703),vec2(-1.03677923708,0.439565833392))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03677923708,0.439565833392),vec2(-1.03493619641,0.434232780007))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03493619641,0.434232780007),vec2(-0.924880247944,0.577456322027))); + d1=abs_min(d1,line_dist(uv,vec2(-0.924880247944,0.577456322027),vec2(-1.00049262137,0.545554106703))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.033868039,0.448069047365),vec2(-1.03677923708,0.439565833392))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03677923708,0.439565833392),vec2(-0.999970513281,0.333055493352))); + d1=abs_min(d1,line_dist(uv,vec2(-0.999970513281,0.333055493352),vec2(-0.926665359012,0.303146964146))); + d1=abs_min(d1,line_dist(uv,vec2(-0.926665359012,0.303146964146),vec2(-1.033868039,0.448069047365))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-1.02909290529,0.462016564017),vec2(-1.03677923708,0.439565833392))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03677923708,0.439565833392),vec2(-1.03497489278,0.434344752485))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03497489278,0.434344752485),vec2(-0.773635973483,0.434344752485))); + d1=abs_min(d1,line_dist(uv,vec2(-0.773635973483,0.434344752485),vec2(-0.782239281314,0.462016564017))); + d1=abs_min(d1,line_dist(uv,vec2(-0.782239281314,0.462016564017),vec2(-1.02909290529,0.462016564017))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.972402534183,0.557405817862),vec2(-1.00049262137,0.545554106703))); + d1=abs_min(d1,line_dist(uv,vec2(-1.00049262137,0.545554106703),vec2(-1.03677923708,0.439565833392))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03677923708,0.439565833392),vec2(-0.999970513281,0.333055493352))); + d1=abs_min(d1,line_dist(uv,vec2(-0.999970513281,0.333055493352),vec2(-0.992084221177,0.329837883348))); + d1=abs_min(d1,line_dist(uv,vec2(-0.992084221177,0.329837883348),vec2(-0.972402534183,0.557405817862))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + + d1=1e38; + d1=abs_min(d1,line_dist(uv,vec2(-0.980652472562,0.553925021021),vec2(-1.00049262137,0.545554106703))); + d1=abs_min(d1,line_dist(uv,vec2(-1.00049262137,0.545554106703),vec2(-1.03677923708,0.439565833392))); + d1=abs_min(d1,line_dist(uv,vec2(-1.03677923708,0.439565833392),vec2(-0.999970513281,0.333055493352))); + d1=abs_min(d1,line_dist(uv,vec2(-0.999970513281,0.333055493352),vec2(-0.980652472562,0.325173725818))); + d1=abs_min(d1,line_dist(uv,vec2(-0.980652472562,0.325173725818),vec2(-0.980652472562,0.553925021021))); + + if(d1<=0.){ + return d1; + } + else{ + poly_d=min(d1,poly_d); + } + } + + + d=min(poly_d,d); + + return d; +} + + +void mainImage( out vec4 fragColor, in vec2 fragCoord ){ + border = 0.0; + + vec2 uv = fragCoord.xy; + + uv.x-=1; + //uv/=10; + float d = 1e38; + + if(all(lessThan(abs(uv-vec2(0.0873228569516,0.500000020681)),vec2(1.58799651081,0.206885941035)+vec2(border)))) + d=min(d,render_serif(uv)); + + + fragColor=vec4(smoothstep(0., 0.0, d)); +} + void main() { - gBaseColor = vec4(TexCoords,1,1); - gPosition = WorldPos; - gNormal = Normal; - gMetallicRoughness = vec2(0,0); + //gBaseColor = vec4(TexCoords,1,1); + //gBaseColor = vec4(240./255, 220./255,157./255,1); + mainImage(gBaseColor, vec2(1.,1.)-TexCoords); + gPosition = WorldPos; + gNormal = normalize(Normal); + //gMetallicRoughness = vec2(1, 46./255); + gMetallicRoughness = vec2( 0 /*½ðÊô¶È*/, 0.8 /*´Ö²Ú¶È*/); } \ No newline at end of file diff --git a/ArchitectureColoredPainting/Shaders/painting.vert b/ArchitectureColoredPainting/Shaders/painting.vert index 8e2587b..f294dc6 100644 --- a/ArchitectureColoredPainting/Shaders/painting.vert +++ b/ArchitectureColoredPainting/Shaders/painting.vert @@ -1,4 +1,4 @@ -#version 330 core +#version 450 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords;