[Projekt] Prozedurales Universum

Hier könnt ihr euch selbst, eure Homepage, euren Entwicklerstammtisch, Termine oder eure Projekte vorstellen.
Forumsregeln
Bitte Präfixe benutzen. Das Präfix "[Projekt]" bewirkt die Aufnahme von Bildern aus den Beiträgen des Themenerstellers in den Showroom. Alle Bilder aus dem Thema Showroom erscheinen ebenfalls im Showroom auf der Frontpage. Es werden nur Bilder berücksichtigt, die entweder mit dem attachement- oder dem img-BBCode im Beitrag angezeigt werden.

Die Bildersammelfunktion muss manuell ausgeführt werden, die URL dazu und weitere Details zum Showroom sind hier zu finden.

This forum is primarily intended for German-language video game developers. Please don't post promotional information targeted at end users.
Benutzeravatar
sushbone
Beiträge: 78
Registriert: 02.06.2013, 15:31

Re: [Projekt] Prozedurales Universum

Beitrag von sushbone »

So es gibt Fortschritte mit der shared RenderTexture. Dieser nervige Bug mit den leeren Texturbereichen hat mich noch ein paar Tage gekostet, dabei war der Bug eigentlich ganz simpel.
Ich hatte zunächst weiterhin die SharedTextureManager Klasse im Verdacht, bzw. das irgendwas mit der Indizierung der freien Slots nicht stimmt.

Am Ende wars ein vergessener RenderTexture.Release() (löscht die RenderTextur) Aufruf den ich in dem Split-Vorgang einer Plane aufgerufen hatte. An sich korrekt die RenderTexture wegzuschmeißen wenn ein Quadtree Node gesplittet wird, dumme Idee wenns eine shared RenderTexture ist. Logischerweise ist der einzige der jetzt noch Releasen darf ist der SharedTextureManager während des Housekeepings, nämlich immer dann wenn eine komplette shared Textur überhaupt nicht mehr verwendet wird. Ansonsten werden die einzelnen Slots ja nun wiederverwendet, ein Release ist nicht mehr notwendig.

Naja, jetzt funktioniert das ganze grundsätzlich ganz gut, ich bin mit der Implementierung erstmal zufrieden. Flexibel sind die Anzahl der Slots in beide Richtungen auf der Textur festlegbar, und das Housekeeping tut was es soll, neue shared RenderTextures werden sauber und transparent im Hintergrund angelegt oder wieder entfernt.

Einziges Problem was ich nun noch in den Griff kriegen muss bevor ich mich mit dem gleichen Prinzip an die ComputeBuffer mache ist das jetzt aufgetretene Bleeding aufgrund des Atlas in den Griff zu kriegen.
Da ich mich damit noch nicht eingehender beschäftigt habe muss ich jetzt mal schauen ob ich das durch Padding auf der RenderTexture in den Griff kriegen muss (sehr ungerne eigentlich) oder ob ich das eher durch Anpassung der UVOffsets und Scale im SurfaceShader angehe.

Was meint ihr was zielführender wäre?

Bild

Bild

EDIT: Einfache half pixel correction war der Trick bei der Berechnung des UVOffset und des Tile-Scale. Jawoll, geil! Jetzt kann ich mit dem shared ComputeBuffer beginnen.

Bild

Bild
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: [Projekt] Prozedurales Universum

Beitrag von joeydee »

Klasse, sieht vielversprechend aus!
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [Projekt] Prozedurales Universum

Beitrag von Krishty »

Sieht schon sehr nützlich aus!
sushbone hat geschrieben:Da ich mich damit noch nicht eingehender beschäftigt habe muss ich jetzt mal schauen ob ich das durch Padding auf der RenderTexture in den Griff kriegen muss (sehr ungerne eigentlich) oder ob ich das eher durch Anpassung der UVOffsets und Scale im SurfaceShader angehe.
Welches Bleeding meinst du denn? Die Naht von einem halben Texel, die man auch auf den Bildern sieht (wäre ein Fall für UV-Offsets), oder was Größeres?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
sushbone
Beiträge: 78
Registriert: 02.06.2013, 15:31

Re: [Projekt] Prozedurales Universum

Beitrag von sushbone »

Krishty hat geschrieben:Sieht schon sehr nützlich aus!
sushbone hat geschrieben:Da ich mich damit noch nicht eingehender beschäftigt habe muss ich jetzt mal schauen ob ich das durch Padding auf der RenderTexture in den Griff kriegen muss (sehr ungerne eigentlich) oder ob ich das eher durch Anpassung der UVOffsets und Scale im SurfaceShader angehe.
Welches Bleeding meinst du denn? Die Naht von einem halben Texel, die man auch auf den Bildern sieht (wäre ein Fall für UV-Offsets), oder was Größeres?
Genau, die Naht auf dem ersten Bild. Hab ich aber in der Tat durch eine Anpassung der UV-Offsets (Verschiebung und Verkleinerung um einen halben Pixel) hinbekommen, Ergebnis ist das letzte Bild.
Passt, ich mach erstmal einen Haken an die Atlastextur und versuche mich jetzt an einem "AtlasBuffer" ;-)
Benutzeravatar
sushbone
Beiträge: 78
Registriert: 02.06.2013, 15:31

Re: [Projekt] Prozedurales Universum

Beitrag von sushbone »

Ich denke ich bin nah dran, aber jetzt hänge ich doch noch an der letzten Stelle fest bei den ComputeBuffern. Frage an die Vertex Shader Profis. ;)
Ich versuche rauszufinden wie ich den Offset in den Vertex Shader integriere beim lesen des Buffers.

In C# erhöhe ich den Count des Buffers mit Multiplikation der Slots:

Code: Alles auswählen

this.computeBuffer = new ComputeBuffer(count * slots, stride , computeBufferType);
Der ComputeShader schreibt in die unterschiedlichen Slots per zusätzlicher Multiplikation mit dem Slot offset (constants.sharedPatchGeneratedFinalDataBufferOffset = 1,2,3,..n):

Code: Alles auswählen

int outBuffOffset = id.x + id.y * constants.nVertsPerEdge * constants.sharedPatchGeneratedFinalDataBufferOffset;
patchGeneratedFinalDataBuffer[outBuffOffset].position = float4(patchCoordCentered,1);
Die Frage ist, wie passe ich den Vertex Shader an um nun vom richtigen Offset zu lesen (aktuell "float4 position = patchGeneratedFinalDataBuffer[v.id].position;")? Aktuell sieht der noch so aus:

Code: Alles auswählen

struct appdata_full_compute {
	...
	#ifdef SHADER_API_D3D11
		uint id: SV_VertexID;
	#endif
};

#ifdef SHADER_API_D3D11
	StructuredBuffer<OutputStruct>	patchGeneratedFinalDataBuffer;
#endif

float4 position = patchGeneratedFinalDataBuffer[v.id].position;

void vert(inout appdata_full_compute v, out Input o)
{
	UNITY_INITIALIZE_OUTPUT(Input, o);
	#ifdef SHADER_API_D3D11
		// Read Data from buffer
		float4 position = patchGeneratedFinalDataBuffer[v.id].position;
		float3 patchCenter = patchGeneratedFinalDataBuffer[v.id].patchCenter;
		...
	#endif
}
Antworten