Gamestudio Links
Zorro Links
Newest Posts
Series within loop
by Spirit
Today at 03:38
ein Truetype wie ein Bitmap Font laden?
by tagimbul
Yesterday at 21:46
'you' and c_scan
by 3run
Yesterday at 17:24
rayp's old school fast zombie FPS project
by 3run
Yesterday at 11:01
No Trades Using Workshop 6
by peterhw
Yesterday at 10:59
Actual PIP Cost for backtesting
by tradingest
10/14/18 16:36
Rigid Force Alpha - Classic side-scrolling shoot'em up
by Turrican
10/14/18 11:44
AUM Magazine
Latest Screens
Worst Case Z
AckCon'18 - Lotter vs the World 2 - Preview Release
Evonet Beta v1.0 : Online Project Development Template
Lake scene
Who's Online
5 registered (kvm, Ayumi, jenGs, PSA, jumpman), 463 Guests and 4 Spiders online.
Key: Admin, Global Mod, Mod
Newest Members
BazGen, pallab1964, wOrlD21, peterhw, 7th_zorro
18076 Registered Users
Topic Options
Rate This Topic
#474049 - 09/13/18 19:45 How to recalculate normals after a shader moves vertices
jumpman Online
Serious User

Registered: 04/17/02
Posts: 1199
Loc: ny
Hello, how do I recalculate a model's normals after I move the vertices within the vertex shader? Is that possible?
_________________________
A8 Pro 8.47

Top
#474195 - 09/28/18 11:03 Re: How to recalculate normals after a shader moves vertices [Re: jumpman]
txesmi Offline
Serious User

Registered: 06/13/07
Posts: 1164
Loc: Hiporope and its pain
No, it is not possible. There is no way of accesing vertex buffers.

Salud!

Top
#474196 - 09/28/18 13:35 Re: How to recalculate normals after a shader moves vertices [Re: txesmi]
Superku Online
Senior Expert

Registered: 09/13/03
Posts: 6757
Loc: Kiel (Germany)
I try to approximate correct normals manually after moving vertices in the vertex shader. For example when I rotate vertices I rotate the normal as well, or when the movement is sine based I add cosine values with the same argument. It's not exact but with the normalization in the pixel shader it oftentimes improves the result over leaving the normal unchanged.
_________________________
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Superku The Game

Severely outdated footage: http://store.steampowered.com/app/407570

Top
#474219 - 10/01/18 01:03 Re: How to recalculate normals after a shader moves vertices [Re: Superku]
jumpman Online
Serious User

Registered: 04/17/02
Posts: 1199
Loc: ny
How do you approximate normals after moving them in the XYZ directions?

(btw how are you rotating vertices?! laugh )

Here is a small version of what Im doing now:

Code:
-----VERTEX SHADER-----
InPos += mul(offset14,matWorldInv );  // move vertex

// Transform the vertex from object space to clip space: 
OutPos = mul(InPos, matWorldViewProj);  //  OutPos = mul(InPos, matWorldViewProj); 
  

// Transform the normal from object space to world space: 
  OutNormal = normalize(mul(InNormal, matWorld));



Edited by jumpman (10/01/18 01:08)
_________________________
A8 Pro 8.47

Top
#474223 - 10/01/18 13:02 Re: How to recalculate normals after a shader moves vertices [Re: jumpman]
Superku Online
Senior Expert

Registered: 09/13/03
Posts: 6757
Loc: Kiel (Germany)
Well in that shader code you quoted all vertices are moved by the same offset, no? Then the normal should stay the same. You'd have to show other code.
The approximation always depends on how you move the vertices, there's no general solution.

My rotation code usually looks something like this:
float effect = InPos.y/32.0; // depends on the model and type of "effect" you want to achieve, this would be for a vertical twist motion
float angle = sin(vecTime.w*0.1)*effect;
float sina = sin(angle);
float cosa = cos(angle);
float oldValue = InPos.x;
InPos.x = cosa*InPos.x - sina*InPos.z;
InPos.z = sina*oldValue + cosa*InPos.z;

If you want to rotate around any other position then the origin/ nullvector, subtract some shift vector or value first, do the rotation and then add the same amount again.
_________________________
"Falls das Resultat nicht einfach nur dermassen gut aussieht, sollten Sie nochmal von vorn anfangen..." - Manual

Superku The Game

Severely outdated footage: http://store.steampowered.com/app/407570

Top
#474264 - 10/02/18 18:21 Re: How to recalculate normals after a shader moves vertices [Re: Superku]
jumpman Online
Serious User

Registered: 04/17/02
Posts: 1199
Loc: ny
Hey superku, I forgot to add the vertex movement part based on texture. This uses tex2dlod, which is a texture fetch within the vertex shader. Wherever there is color information, these areas vertices will be moved:

Code:
////---- TOP LEFT -- CLOTH 0 RED
float4 cloth1 = tex2Dlod(clothSampler5, float4(InTex.x*0.5f,InTex.y*0.5f,0,0) ); 
float3 offset1 = float3(cloth1.r*vertMove0.r,cloth1.r*vertMove0.g,cloth1.r*vertMove0.b);

InPos += mul(offset1,matWorldInv );

// Transform the vertex from object space to clip space: 
OutPos = mul(InPos, matWorldViewProj);  //  OutPos = mul(InPos, matWorldViewProj); 
  

// Transform the normal from object space to world space: 
  OutNormal = normalize(mul(InNormal, matWorld));



As you can see, vertices are moved in the cardinal directions
_________________________
A8 Pro 8.47

Top


Moderator:  Blink, Hummel, Superku 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de