Du bist nicht angemeldet.

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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

21.11.2014, 23:57

Texture auf Kreis

Ich habe einblödes Problem. Und zwar haben wir in Physik und Informatik eine simple Simulation der Planeten in unserem Sonnensystem Geschrieben. Nun wollte/sollte ich für eine Veranstaltung das ganze mit Texturen auf hübschen. So die Texturen sind Quadratisch 512*512 mit einem Kreis drin der die eigendtliche Texture darstelt. Nun meine Frage wie bekomme ich diese Quadratische Texture so auf einen Kreis (24 Eck) gelegt das nicht die ganze Texture verzogen wird sondern nur der Planet zu sehen ist.

Danke schon einmal
Volker

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

22.11.2014, 00:12

Denkbar einfach, indem du die Vertex-Positionen als Texturkoordinaten nimmst (natürlich so skaliert, dass die ganze Textur draufpasst).

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

22.11.2014, 08:20

Alternative Antwort: Du zeichnest keinen Kreis, sondern das Quadrat der Textur. Wenn der Kreis auf die Textur gemalt ist, macht es das gesamte Verfahren wesentlich einfacher.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

30.11.2014, 12:57

Er sagte "Kreis" und nicht "Kugel".
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

30.11.2014, 14:10

Zeichne einfach ein Quadrat (bzw. zwei Dreiecke) und Verwerfe alle Pixel, die auserhalb des Kreises sind:

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
/* --- HLSL Example: --- */
uniform sampler2D tex;
uniform float circleRadius; // 0.5 to get the maximal circle size
float4 PS(float2 texCoord : TEXCOORD0)
{
    float distanceToCenter = distance(texCoord, float2(0.5, 0.5));
    clip(distanceToCenter - circleRadius);
    return tex2D(tex, texCoord);
}


HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
/* --- GLSL Example: --- */
uniform sampler2D tex;
uniform float circleRadius; // same here
in vec2 texCoord;
out vec4 fragColor;
void main()
{
    float distanceToCenter = distance(texCoord, float2(0.5, 0.5));
    if (distanceToCenter < circleRadius)
        discard;
    fragColor = texture(tex, texCoord);
}

Damit hast du einen perfekten Kreis, allerdings müsstest du dann das Anti-Aliasing selber machen.

6

30.11.2014, 14:27

@LukasBanana: Ich hab da mal was gelesen. Ich weiß aber nicht ob das jetzt auf deinen GLSL-Code zutrifft :hmm: :
https://www.opengl.org/wiki/Sampler_%28G…rm_flow_control

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

30.11.2014, 20:03

Das sollte in diesem Fall kein Problem sein, da das "discard" und nicht die Texture Zugriffen im Dynamic Branch sind.
Wenn "discard" aufgerufen wird, wird das Fragement verworfen, das heißt aber nicht, dass der Fragment Shader nicht bis zum Ende durchläuft.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

30.11.2014, 20:05

Ich hoffe das war eher der Vollständigkeit halber? Oder wozu einfach, wenn's auch kompliziert geht?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

30.11.2014, 21:32

Wenn man die Textur nicht vorher von Hand modifizieren kann, sollte es die einfachste und wahrscheinlich sogar schnellste Möglichkeit sein.
Ich meine, Shader braucht man heutzutage sowieso und 4 Zeilen mehr Shader ist eher weniger Aufwand als Davids Vorschlag.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

01.12.2014, 06:46

Genau, den wichtigsten Punkt hast Du aber von vornherein ausgeschlossen: Die Textur passend zu modifizieren. Einen Kreis in der Mitte und rundrum Transparenz. Damit ist man wesentlich flexibler und muss sich nicht mal selbst um das Antialiasing kümmern, was bei dem Shader mit discard der Fall wäre. Lukas sagte ja schon, dass das fehlt und genau da wird's mit dem Shader auch unnötig hässlich und aufwendig. GIMP auf, Kreis markiert, Maske invertiert, Inhalt entfernt, fertig. Hübscher Kreis mit Antialiasing.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige