Gamestudio Links
Zorro Links
Newest Posts
How is this possible ? winning percentage 100%
by MatPed
50 minutes 13 seconds ago
Next contest?
by Michael_Schwarz
Today at 10:33
Help! 1.88.6 Crashes <5 minutes after clicking Trade!
by jcl
Today at 10:28
WFO
by jcl
Today at 10:27
TA-Lib not updated
by jcl
Today at 10:24
CyberCycle Adaptive Cy
by OptimusPrime
Today at 05:26
video memory and d3d_texfree
by Superku
Yesterday at 11:17
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
16 registered (CocaCola, kvm, MatPed, Iglarion, AndrewAMD, brax, Michael_Schwarz, Mio, 2 invisible), 454 Guests and 3 Spiders online.
Key: Admin, Global Mod, Mod
Newest Members
fandi, Deedee, avgtrader, aventador, gokhanuck
18103 Registered Users
Topic Options
Rate This Topic
#474049 - 09/13/18 19:45 How to recalculate normals after a shader moves vertices
jumpman Offline
Serious User

Registered: 04/17/02
Posts: 1202
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: 1182
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 Offline
Senior Expert

Registered: 09/13/03
Posts: 6771
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 Offline
Serious User

Registered: 04/17/02
Posts: 1202
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 Offline
Senior Expert

Registered: 09/13/03
Posts: 6771
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 Offline
Serious User

Registered: 04/17/02
Posts: 1202
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