Sign in to follow this  
n3Xus

DX11 [DX11] Using tessellation to smooth lines into curves

Recommended Posts

n3Xus    951
Hello,

This is what I want: make a line with a few points and then use tessellation to smooth it.


So far I got it working for a single quadratic or a single cubic bezier curve, but whenever I try to connect more curves I get sharp edges where they connect.

I tried linearly interpolating at the edges of two curves but that still produces a slight spike (I also tried a sine function to smooth instead of a linear, it is slightly better but still not perfect).


Has anyone done this and has some code to share or some other suggestions on how to produce a smooth line using dx11 tessellator?

Share this post


Link to post
Share on other sites
Tordin    625
I dont think you can do that.

A Tessellation is only to break up a triangel in more triangels to get a more highpolly model. (with good use of a height map)

But im not sure!

Share this post


Link to post
Share on other sites
n3Xus    951
Well you can tessellate a line, I'll try using a animated "heightmap" on a tessellated line and hopefully it will look good [img]http://public.gamedev.net/public/style_emoticons/default/biggrin.gif[/img].

But still, if anyone managed to properly smooth a line, do tell.

Share this post


Link to post
Share on other sites
dblack    150
[quote name='n3Xus' timestamp='1306629215' post='4816947']
Hello,

This is what I want: make a line with a few points and then use tessellation to smooth it.


So far I got it working for a single quadratic or a single cubic bezier curve, but whenever I try to connect more curves I get sharp edges where they connect.

I tried linearly interpolating at the edges of two curves but that still produces a slight spike (I also tried a sine function to smooth instead of a linear, it is slightly better but still not perfect).


Has anyone done this and has some code to share or some other suggestions on how to produce a smooth line using dx11 tessellator?
[/quote]

You probably want to use a curve formulation where you can ensure continuity at the connections/segments, then if needed you can convert that representation to a set of beziers(or whatever is easiest to render). For example you could use a BSpline curve(or other curve with local support). Using Bezier directly is problematic due to trying to choose points so that the tangents match at the join.

Take a look at the articles on Wikipedia or do a google search for more info(there are a ton of books and articles about parametric curves..).


David

Share this post


Link to post
Share on other sites
n3Xus    951
dblack: yeah, continuity was what I needed :D
I found the solution on the most bottom applet on this page: [url="http://www.doc.ic.ac.uk/~dfg/AndysSplineTutorial/Beziers.html"]http://www.doc.ic.ac.uk/~dfg/AndysSplineTutorial/Beziers.html[/url]

It works now, thanks for the suggestions!

Share this post


Link to post
Share on other sites
dblack    150
[quote name='n3Xus' timestamp='1306683390' post='4817134']
dblack: yeah, continuity was what I needed :D
I found the solution on the most bottom applet on this page: [url="http://www.doc.ic.ac.uk/~dfg/AndysSplineTutorial/Beziers.html"]http://www.doc.ic.ac...al/Beziers.html[/url]

It works now, thanks for the suggestions!
[/quote]

Not sure about that article, it seems a bit 'iffy'/vague, I would recommend you also at least read some other articles which have a more solid description of continuity and B-Spline curves. However I cant view the applets so cant comment on anything but the text.

The best description I have found so far, if you want to get further into the subject, is "The NURBS Book", although it is a bit specialized to NURBS. The Wikipedia articles also looked fairly informative.

But it is good that it is working now:-)


David

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By gsc
      Hi! I am trying to implement simple SSAO postprocess. The main source of my knowledge on this topic is that awesome tutorial.
      But unfortunately something doesn't work... And after a few long hours I need some help. Here is my hlsl shader:
      float3 randVec = _noise * 2.0f - 1.0f; // noise: vec: {[0;1], [0;1], 0} float3 tangent = normalize(randVec - normalVS * dot(randVec, normalVS)); float3 bitangent = cross(tangent, normalVS); float3x3 TBN = float3x3(tangent, bitangent, normalVS); float occlusion = 0.0; for (int i = 0; i < kernelSize; ++i) { float3 samplePos = samples[i].xyz; // samples: {[-1;1], [-1;1], [0;1]} samplePos = mul(samplePos, TBN); samplePos = positionVS.xyz + samplePos * ssaoRadius; float4 offset = float4(samplePos, 1.0f); offset = mul(offset, projectionMatrix); offset.xy /= offset.w; offset.y = -offset.y; offset.xy = offset.xy * 0.5f + 0.5f; float sampleDepth = tex_4.Sample(textureSampler, offset.xy).a; sampleDepth = vsPosFromDepth(sampleDepth, offset.xy).z; const float threshold = 0.025f; float rangeCheck = abs(positionVS.z - sampleDepth) < ssaoRadius ? 1.0 : 0.0; occlusion += (sampleDepth <= samplePos.z + threshold ? 1.0 : 0.0) * rangeCheck; } occlusion = saturate(1 - (occlusion / kernelSize)); And current result: http://imgur.com/UX2X1fc
      I will really appreciate for any advice!
    • By isu diss
       I'm trying to code Rayleigh part of Nishita's model (Display Method of the Sky Color Taking into Account Multiple Scattering). I get black screen no colors. Can anyone find the issue for me?
       
      #define InnerRadius 6320000 #define OutterRadius 6420000 #define PI 3.141592653 #define Isteps 20 #define Ksteps 10 static float3 RayleighCoeffs = float3(6.55e-6, 1.73e-5, 2.30e-5); RWTexture2D<float4> SkyColors : register (u0); cbuffer CSCONSTANTBUF : register( b0 ) { float fHeight; float3 vSunDir; } float Density(float Height) { return exp(-Height/8340); } float RaySphereIntersection(float3 RayOrigin, float3 RayDirection, float3 SphereOrigin, float Radius) { float t1, t0; float3 L = SphereOrigin - RayOrigin; float tCA = dot(L, RayDirection); if (tCA < 0) return -1; float lenL = length(L); float D2 = (lenL*lenL) - (tCA*tCA); float Radius2 = (Radius*Radius); if (D2<=Radius2) { float tHC = sqrt(Radius2 - D2); t0 = tCA-tHC; t1 = tCA+tHC; } else return -1; return t1; } float RayleighPhaseFunction(float cosTheta) { return ((3/(16*PI))*(1+cosTheta*cosTheta)); } float OpticalDepth(float3 StartPosition, float3 EndPosition) { float3 Direction = normalize(EndPosition - StartPosition); float RayLength = RaySphereIntersection(StartPosition, Direction, float3(0, 0, 0), OutterRadius); float SampleLength = RayLength / Isteps; float3 tmpPos = StartPosition + 0.5 * SampleLength * Direction; float tmp; for (int i=0; i<Isteps; i++) { tmp += Density(length(tmpPos)-InnerRadius); tmpPos += SampleLength * Direction; } return tmp*SampleLength; } static float fExposure = -2; float3 HDR( float3 LDR) { return 1.0f - exp( fExposure * LDR ); } [numthreads(32, 32, 1)] //disptach 8, 8, 1 it's 256 by 256 image void ComputeSky(uint3 DTID : SV_DispatchThreadID) { float X = ((2 * DTID.x) / 255) - 1; float Y = 1 - ((2 * DTID.y) / 255); float r = sqrt(((X*X)+(Y*Y))); float Theta = r * (PI); float Phi = atan2(Y, X); static float3 Eye = float3(0, 10, 0); float ViewOD = 0, SunOD = 0, tmpDensity = 0; float3 Attenuation = 0, tmp = 0, Irgb = 0; //if (r<=1) { float3 ViewDir = normalize(float3(sin(Theta)*cos(Phi), cos(Theta),sin(Theta)*sin(Phi) )); float ViewRayLength = RaySphereIntersection(Eye, ViewDir, float3(0, 0, 0), OutterRadius); float SampleLength = ViewRayLength / Ksteps; //vSunDir = normalize(vSunDir); float cosTheta = dot(normalize(vSunDir), ViewDir); float3 tmpPos = Eye + 0.5 * SampleLength * ViewDir; for(int k=0; k<Ksteps; k++) { float SunRayLength = RaySphereIntersection(tmpPos, vSunDir, float3(0, 0, 0), OutterRadius); float3 TopAtmosphere = tmpPos + SunRayLength*vSunDir; ViewOD = OpticalDepth(Eye, tmpPos); SunOD = OpticalDepth(tmpPos, TopAtmosphere); tmpDensity = Density(length(tmpPos)-InnerRadius); Attenuation = exp(-RayleighCoeffs*(ViewOD+SunOD)); tmp += tmpDensity*Attenuation; tmpPos += SampleLength * ViewDir; } Irgb = RayleighCoeffs*RayleighPhaseFunction(cosTheta)*tmp*SampleLength; SkyColors[DTID.xy] = float4(Irgb, 1); } }  
    • By amadeus12
      I made my obj parser
      and It also calculate tagent space for normalmap.
      it seems calculation is wrong..
      any good suggestion for this?
      I can't upload my pics so I link my question.
      https://gamedev.stackexchange.com/questions/147199/how-to-debug-calculating-tangent-space
      and I uploaded my code here


      ObjLoader.cpp
      ObjLoader.h
    • By Alessandro Pozzer
      Hi guys, 

      I dont know if this is the right section, but I did not know where to post this. 
      I am implementing a day night cycle on my game engine and I was wondering if there was a nice way to interpolate properly between warm colors, such as orange (sunset) and dark blue (night) color. I am using HSL format.
      Thank  you.
    • By thefoxbard
      I am aiming to learn Windows Forms with the purpose of creating some game-related tools, but since I know absolutely nothing about Windows Forms yet, I wonder:
      Is it possible to render a Direct3D 11 viewport inside a Windows Form Application? I see a lot of game editors that have a region of the window reserved for displaying and manipulating a 3D or 2D scene. That's what I am aiming for.
      Otherwise, would you suggest another library to create a GUI for game-related tools?
       
      EDIT:
      I've found a tutorial here in gamedev that shows a solution:
      Though it's for D3D9, I'm not sure if it would work for D3D11?
       
  • Popular Now