[openGL] texture wrap?

Pagina: 1
Acties:

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Argh ik wordt gek hehe ;) Onderstaande plaatje:

Afbeeldingslocatie: http://www.cs.vu.nl/~fasmit/text.jpg

Dat zijn 4 blokken met textures van 1024x1024, die naadloos aansluiten. Nou komen er om de een of andere manier steeds zwarte randen omheen zoals je ziet in oa de rode cirkels.

Ik check al of er een texture coordinaat buiten [0,1] inclusief ligt, en dat is niet het geval. Verder zet ik ook nog de texture clamp optie in opengl voor beiden. Als ik niet clamp, dan wordt het ipv zwart een stukje kleur van de overliggende zijde. Het wrapped dan dus. Maar alle coordinaten liggen tussen 0,1.

Verder zijn de textures nu standaard opengl 2d textures (want 1024x1024). Maar met 1025x1025 textures en de nv_texture_rect extension gebeurt er hetzelfde...

Hoe kan dit? Kan ik hier iets aan doen? Zou het kunnen liggen aan mijn nv geforce3? Drivers?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is een beetje een probleem. Je weet natuurlijk dat er bilineair geinterpoleerd wordt, maar daarvoor wordt gekeken naar het midden van de pixel. Als de linkerboven texel rood is gekleurd, dan krijgt de pixel die overeen komt met coordinaten (0, 0) 1/4e deel van die rode pixel, maar ook respectievelijk 1/4e deel van de pixels die er links, boven, en linksboven van liggen. Dit kun je natuurlijk oplossen door er de helft van de pixelgrootte bij de coordinaten op te tellen of af te trekken, maar dan wordt er niet goed bilineair geinterpoleerd tussen de randen van de textures. Je zult dus een horizontale en verticale rand van 1 pixel breed moeten kopieren naar de rand van de texture die er op aansluit, zodat de bilineaire interpolatie wel goed gedaan kan worden.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ja ik dacht al dat het zoiets was... ik had wel al ge-experimenteerd met de texture coordinaten een texel op te schuiven (dus iets van [0.01, 0.99]) Maar dan sluit het idd dus ook niet helemaal goed aan. Bovendien is dat een gedoe, omdat ik zelf grof mipmap en de textures steeds wijzigen van grootte. Hoewel het wel beter is dan van die lelijke zwarte randen... Maar kan ik dit niet afzetten in opengl oid? Dat de randen niet geinterpoleerd worden?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mwoa, als je idd gewoon de coordinaten iets opschuift dan zou je als het goed is niet eens last moeten hebben van zwarte randen. Je textures zijn 1024x1024, dus een pixel is 1/1024x1/1024, en dus moet je ze 1/2048 (een halve pixel) opschuiven.

En zoals ik al zei, dat zorgt idd nog steeds niet dat ze goed aansluiten, daarvoor moet een rand van pixels op beide textures overeenkomen.

Er zijn trouwens 2 verschillende soorten clamping, de ene clampt met een border color, en de andere herhaalt steeds de kleur van de rand.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Topicstarter
Ok fixed. GL_CLAMP_TO_EDGE was nodig (ipv GL_CLAMP), dan worden de borders niet gesampled. Alternatief bij power of two textures kan je ook een border van 1 opgeven, maar dat kon hier niet omdat dat niet samen gaat met de nv_texture_rectangle extension. clamp to edge gaat niet goed bij mipmappen, maar dat kan toch niet met rectangular textures. Overigens is clamp to edge blijkbaar standaard D3D gedrag.