Waar het om gaat is wanneer je pixelshader wordt uitgevoerd. Laten we voor het gemak even denken in hele coordinaten (dus een 16 texels brede texture loopt van 0 tot 16, en eveneens zo voor de framebuffer). Als jij een quad tekent van (0, 0) tot (16, 16) dan runt je pixelshader voor elk hele coordinaat in DX9. Dus x=0, x=1, x=2, etc., t/m x=15. Gebruik je ook bijbehorende texturecoordinaten van (0, 0) tot (16, 16), dan worden die ook gewoon geinterpoleerd van 0 tot 16, wat betekent dat je bij x=0 ook u=0 hebt, en bij x=1 ook u=1, etc.
Het probleem is echter, als jij precies de texel linksboven in het texture wilt samplen, dan heb je (0.5, 0.5) als coordinaat nodig. Echter, de geinterpoleerde texture-coordinaat is bij de eerste pixel (0, 0). Schuif je je texture coordinaten naar rechtsonder - dus de texturecoordinaten van de quad lopen van (0.5, 0.5) tot (16.5, 16.5). En nu ik dit opschrijf besef ik me ook ineens waar de fout vandaan komt, zie jij 'm ook? Ja, dat was 16.5, en niet 15.5, zoals ik in mijn originele post suggereerde. Natuurlijk, de laatste sample, x=15, zal een u=15.5 hebben. Maar je quad loopt tot 16 (of minder, als het maar meer is dan 15), dus moet je texture ook zo ver doorlopen anders wordt hij gestretcht. Een andere optie is natuurlijk om je quad een halve pixel naar linksboven te bewegen, zoals je eerder al geprobeerd had.
Maar goed, dat geldt dus voor texture sampling. Wat jij voor je noise generator nodig hebt ligt natuurlijk aan je eigen wensen. De vraag die je moet stellen is: waar ligt precies het linkerbovenste noise sample, op (0, 0) of op (0.5, 0.5)?
Zie ook
http://msdn.microsoft.com/en-us/library/bb219690(VS.85).aspx.
(Let er trouwens wel op dat dit met D3D10 veranderd is - daar wordt een pixel in de framebuffer wel op (0.5, 0.5) gesampled, zoals in OpenGL)
[
Voor 10% gewijzigd door
.oisyn op 21-05-2010 00:39
]