3D-grafik i Java, vilken metod ska jag använda (egen motor)

Permalänk
Medlem

3D-grafik i Java, vilken metod ska jag använda (egen motor)

Hej, håller på och pysslar med ett spel i Java, och jobbar just nu med den bakomliggande grafikmotorn. Spelet är helt voxel-baserat (jag vill öva på programmering, inte 3D-modellering), tänk typ Minecraft som grundidé, fast med lite andra spelmoment och mål.

Jag vill bygga min grafikmotor själv för att lära mig mer om de bakomliggande mekanismerna, men jag funderar på vilket sätt jag ska bygga upp den. Den kommer att behöva vara ganska effektiv för att rendera upp det jag vill visa på skärmen, och jag funderade på ett par olika metoder:

¤ Använda "Graphics"-klassen i Java för att måla upp "polygoner" för varje sida av varje voxel i spelvärlden.

¤ Loopa igenom alla pixlar och kolla upp "vad som ska visas där" - känns spontant väldigt ineffektivt.

¤ Någon annan?

Jag letar inte efter en kod att kopiera in (vill klura ut det själv), men skulle behöva lite vägledning gällande algoritmen i stort.

Tack på förhand,

John

Visa signatur

Case: Fractal Design Arc MoBo: Asus SaberTooth P67 B3 CPU: Intel Core i5 2500k @4.5 GHz Cooler: Noctua NH-D14 GFX: Asus Geforce GTX 690 RAM: 16 GB Corsair Vengeance 1600 MHz SSD: Intel 320 series 160GB HDD: WD Caviar Green 2 TB PSU: Corsair TXV2 650W Monitor: LG IPS231P Accessories: Steelseries Sensei ¤ MS Sidewinder X4 ¤ Steelseries Siberia V2

Permalänk
Hedersmedlem
Skrivet av Svj0hn:

Hej, håller på och pysslar med ett spel i Java, och jobbar just nu med den bakomliggande grafikmotorn. Spelet är helt voxel-baserat (jag vill öva på programmering, inte 3D-modellering), tänk typ Minecraft som grundidé, fast med lite andra spelmoment och mål.

Jag vill bygga min grafikmotor själv för att lära mig mer om de bakomliggande mekanismerna, men jag funderar på vilket sätt jag ska bygga upp den. Den kommer att behöva vara ganska effektiv för att rendera upp det jag vill visa på skärmen, och jag funderade på ett par olika metoder:

¤ Använda "Graphics"-klassen i Java för att måla upp "polygoner" för varje sida av varje voxel i spelvärlden.

¤ Loopa igenom alla pixlar och kolla upp "vad som ska visas där" - känns spontant väldigt ineffektivt.

¤ Någon annan?

Jag letar inte efter en kod att kopiera in (vill klura ut det själv), men skulle behöva lite vägledning gällande algoritmen i stort.

Tack på förhand,

John

När du skriver voxelbaserat, menar du då att alla dina "modeller"/grafiska element byggs upp av block?

Skulle rekommendera att du kanske provar lwjgl (http://www.lwjgl.org/) eller Jogl (http://jogamp.org/), som båda ger dig tillgång till OpenGL från java, dvs som ditt förslag nr 1 fast mkt mer effektivt än javas graphics-klasser (MineCraft använder lwjgl, själv har jag alltid använt jogl). Principen är dock densamma, dvs rita varje byggsten som ett par trianglar/quads/polygoner helt enkelt.

Att loopa igenom alla pixlar och kolla vad som ska visas där låter som någon form av raytracing...skulle kanske undvika det till en början ;).

Visa signatur

Every time you create an iterator: God kills a kitten.

Permalänk
Medlem
Skrivet av Svj0hn:

¤ Loopa igenom alla pixlar och kolla upp "vad som ska visas där" - känns spontant väldigt ineffektivt.

Detta är ett steg som alltid måste ske, annars blir det inget på skärmen! Dock är det en lågnivåoperation, och tas vanligtvis om hand av något högnivåinterface, typ OpenGL, så man slipper tänka på det själv. Behöver du ha absolut bästa möjliga prestanda kan det vara ide att göra detta steg själv, optimerat för just ditt fall. Men det är lämpligast att börja med en enklare lösning för att se om det räcker.

Jag skulle börja som GiGurra säger. Se dock till att hanteringen av blocken är så optimerad som möjligt. Dvs, rita inte de sidor på blocken som inte syns, rita inte de block som är skymda av andra block etc. Men se till att allt fungerar innan du börjar optimera allt för mycket - "Premature optimization is the root of all evil!"

Permalänk
Medlem

Är du ute efter att lära dig så är det faktiskt ganska kul att skriva sina egna rasterizers i ett högnivåspråk för att sen optimera det i assembly. Det är faktiskt något du KAN göra i java (skriva i bytekod) men det kommer inte vara speciellt praktiskt och i slutändan kommer du nog ändå få gå över till hårdvaruaccelererad för att få prestanda i högre upplösningar.

Permalänk
Medlem
Skrivet av 'Gi:

[Gurra;13481962']När du skriver voxelbaserat, menar du då att alla dina "modeller"/grafiska element byggs upp av block?

Skulle rekommendera att du kanske provar lwjgl (http://www.lwjgl.org/) eller Jogl (http://jogamp.org/), som båda ger dig tillgång till OpenGL från java, dvs som ditt förslag nr 1 fast mkt mer effektivt än javas graphics-klasser (MineCraft använder lwjgl, själv har jag alltid använt jogl). Principen är dock densamma, dvs rita varje byggsten som ett par trianglar/quads/polygoner helt enkelt.

Att loopa igenom alla pixlar och kolla vad som ska visas där låter som någon form av raytracing...skulle kanske undvika det till en början ;).

Tack!

Jag hade tänkt gå över till något OpenGL-bibliotek efter att spelet är "klart", men kanske är bättre att göra det i ett tidigare skede?

Visa signatur

Case: Fractal Design Arc MoBo: Asus SaberTooth P67 B3 CPU: Intel Core i5 2500k @4.5 GHz Cooler: Noctua NH-D14 GFX: Asus Geforce GTX 690 RAM: 16 GB Corsair Vengeance 1600 MHz SSD: Intel 320 series 160GB HDD: WD Caviar Green 2 TB PSU: Corsair TXV2 650W Monitor: LG IPS231P Accessories: Steelseries Sensei ¤ MS Sidewinder X4 ¤ Steelseries Siberia V2