pixelprobleempje

Status
Niet open voor verdere reacties.

Murdocki

Gebruiker
Lid geworden
7 jun 2007
Berichten
449
hey,

ik probeer gedeeltes van een texture te tekenen maar soms en soms ook niet gaat er iets fout bij de linkerbovenhoek, daar staat dan een pixel die eigenlijk in het plaatje 1pixel naar links staat.

screenie:
tiles.bmp

onderin is de texture, bovenin zijn gedeeltes van deze texture apart getekend. als je in zoomt zie je de verkeerde pixels

code:

tekenprocedure:
Code:
void MapContents::render( Renderer* renderer )
{
	int tilenumber = 0;
	vector< int >::iterator pos, end = tileList.end();
	for( pos = tileList.begin(); pos != end; pos++ )
	{
		int row = tilenumber / cols;
		int col = tilenumber % cols;
		int x = col * 35 + 3;
		int y = row * 35 + 3;
		int xOffset = (*pos) * 32;

		renderer->draw2DImage( texturePath, x, y, xOffset, 0, 32, 0 );

		tilenumber++;
	}
	renderer->draw2DImage( texturePath, x, 300 );
	//renderer->draw2DImage( texturePath, x, y + 50, 33, 0, 32, 0 );
}

opbouwen van de vertex:

Code:
	stD3DTextureVertex vertices[] = {
{ (float)x,        (float)y,        0.0f, 1.0f, D3DCOLOR_XRGB( 255, 255, 255 ), getTextureOffsetMin( origW, xOffset, w ), getTextureOffsetMin( origH, yOffset, h ) },
{ (float)(x+w),  (float)y,        0.0f, 1.0f, D3DCOLOR_XRGB( 255, 255, 255 ), getTextureOffsetMax( origW, xOffset, w ), getTextureOffsetMin( origH, yOffset, h ) },
{ (float)(x+w),  (float)(y + h),0.0f, 1.0f, D3DCOLOR_XRGB( 255, 255, 255 ), getTextureOffsetMax( origW, xOffset, w ), getTextureOffsetMax( origH, yOffset, h ) },
{ (float)x,	     (float)(y + h),0.0f, 1.0f, D3DCOLOR_XRGB( 255, 255, 255 ), getTextureOffsetMin( origW, xOffset, w ), getTextureOffsetMax( origH, yOffset, h ) } };

hulpmethodes voor het opbouwen van de vertex:
Code:
float getTextureOffsetMin( int orig, int offset, int x )
{
	float value = 0.0f;
	float pixSize = 1.0f / orig;
	value = pixSize * offset;

	return value;
}
float getTextureOffsetMax( int orig, int offset, int x )
{
	float value = 1.0f;
	float pixSize = 1.0f / orig;
	value = pixSize * ( offset + x );

	return value;
}

iemand enig idee waardoor het komt of hoe ik het op kan lossen?
 
heeft iemand dan een idee waar het misschien aan kan liggen dat ik daarnaar kan zoeken?
 
heeft iemand dan een idee waar het misschien aan kan liggen dat ik daarnaar kan zoeken?
Zijn de waardes die aan renderer->draw2DImage( texturePath, x, y, xOffset, 0, 32, 0 ); worden meegegeven wel goed? Je zou de verschillende waardes van xOffset kunnen bekijken. Ik denk overigens niet dat dat het probleem is. Het is maar een gokje.
 
ik stuur daar heen (*pos) * 32, dat is dus tileNr * 32 dus
0: 0
1: 32
2: 64

dit is goed want tile 1 is van 0 tm 31, 2 is van 32 tm 63 en 3 is van 64 tm 95
of alles +1 als je de eerste pixel pixel nr 1 noemt.

er zit een patroon in trouwens, x'jes zijn fout:

o o o o o
x x o x x
o o o o o
o x x o x
o o o o o

blijkbaar zijn oneven regels in hun geheel goed, zou het iets met de y locatie waarop ik teken te maken kunnen hebben? dat het iets met de projection matrix is ofzo.
voor reference die zet ik zo in elkaar:
Code:
calculateProjectionMatrix( D3DX_PI / 4, 0.1f, 1000 );

void Renderer::calculateProjectionMatrix( float fieldOfView, float n, float f )
{
	if( !(*targetCanvasDevice) )
		return;
	canBeUsed = false;

	D3DXMATRIX projection;
	
	float aspectRatio = (float)targetCanvas->getWidth() / (float)targetCanvas->getHeight();
	D3DXMatrixPerspectiveFovLH( &projection, fieldOfView, aspectRatio, n, f );

	(*targetCanvasDevice)->SetTransform( D3DTS_PROJECTION, &projection );
	canBeUsed = true;
}
 
Sorry, ik heb verder ook geen idee waar je het zou kunnen zoeken. Hoeveel keer doorloop je die for lus? 25 keer totaal en xOffset is altijd 0, 32 of 64 geen overflow dus wat ik eerst dacht.

edit:
Je kan kijken of je het probleem ook hebt als je telkens dezelfde texture meerdere keren tekent (en dus niet 3 verschillende). Misschien geeft dat een aanwijzing.

p.s. van welke library maak je gebruik. Ik zie allemaal functies die mij niet bekend voorkomen (zoals D3DXMatrixPerspectiveFovLH() en SetTransform().
 
Laatst bewerkt:
de lib is die van directx. wel een slim idee trouwens om dezelfde texture te gebruiken, dat ga ik even proberen
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan