Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"dot"«
Naja sowas nennt sich Decal und wie es funktioniert hast du im Prinzip eh schon rausgefunden indem du dir den Wireframe angeschaut hast. Es wird halt ein kleines, entsprechend der darunterliegenden Oberfläche geformtes, Sprite gemacht und darauf is dann deine Decal-Textur (das Einschussloch) und das wird dann gerendert. Um z-Fighting zu vermeiden verwendet man zum Rendern von Decals normal den Stencil Buffer oder einen Depth Bias oder man packt das Sprite einfach mit einem sehr kleinen Offset vor die darunterliegenden Polygone.
Mit Multitexturing würde das übrigens theoretisch schon auch gehen, wäre allerdings nicht unbedingt effizient.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#define MAX_PROJECTORS 6 float4x4 mProjector [MAX_PROJECTORS]; float fProjectorRange [MAX_PROJECTORS]; TEXTURE ProjectorTexture; int iNumberOfProjectors; // Noch n Sampler sampler SS_ProjectorTexture = sampler_state { Texture = <ProjectorTexture>; MINFILTER = LINEAR; MAGFILTER = LINEAR; MIPFILTER = LINEAR; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
float4 ProjColor = float4(0, 0, 0, 1); for (int p = 0; p < MAX_PROJECTORS && p < iNumberOfProjectors; p++) { // In das Koordinatensystem des Projektors transformieren float4 RelPos = mul (vInPos, mProjector [p]); RelPos /= RelPos.w; float2 TexCoord; TexCoord.x = 0.5f * RelPos.x + 0.5f; TexCoord.y = 0.5f - 0.5f * RelPos.y; if(TexCoord.x < 1 && TexCoord.x > 0 && TexCoord.y < 1 && TexCoord.y >0 && RelPos.z > 0) { float4 Color = tex2D(SS_ProjectorTexture,TexCoord); ProjColor += Color * (1-min (1, RelPos.z / fProjectorRange[p])); } } |
Werbeanzeige