Hi Spieleprogrammierer! Ich bräuchte einmal eure Hilfe.
Ich möchte das man auf meinem Terrain zeichnen kann, dafür habe ich mich fürs Texture-Splatting entschieden. In meinem Shader rechne ich die Pixel So zusammen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
float4 map = tex2D(sMap, In.Texcoord);
colmap += tex2D(sRed, In.Texcoord) * map.r;
colmap += tex2D(sGreen, In.Texcoord) * map.g;
colmap += tex2D(sBlue, In.Texcoord) * map.b;
colmap += tex2D(sAlpha, In.Texcoord) * map.a;
|
Ein PIxel in der Colormap setze ich folgendermaßen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
unsigned int color = ((unsigned int*)lockedRect.Bits)[y * mWidth + x];
float a = intensity * 255.0f * pen->Intensity;
Vector3 rgb = Vector3Normalize(Vector3(static_cast<float>(GetR(color)),
static_cast<float>(GetG(color)),
static_cast<float>(GetB(color)))) * (255.0f - a);
if(a > GetA(color))
((unsigned int*)lockedRect.Bits)[y * mWidth + x] = SetARGB(Vector4(a, rgb.X, rgb.Y, rgb.Z));
|
Zuvor Locke ich den Texture Buffer und gehe alle Pixel durch, und dann anhand der deferenz zum mittelpunkt der "Stift Position" bestimme ich die intensität, sodass ein sanfter übergang zwischen den texturen entsteht.
Als erstes hole ich mir den gewünschten Pixel aus dem Buffer und anschließend berechne ich die intensität dieses Pixels, in diesem fall nur des Alpha Kanals. Danach erstelle ich einen Vector3 und fülle ihn mit den R G und B Werten des Pixels, und schließlich Normalisiere ich ihn und multiplitziere ihn mit der deffernez des Alpha Werts und 255. Danach teste ich ob der neue Alpha Wert auch größer ist als der alte, und wenn dies zutrifft, fülle ich den Buffer mit diesem Pixel.
Soweit funktioniert das auch sehr gut, solange sich nur 2 Texturen überschneiden, wenn sich aber 3 Texturen überschneiden wird diese stelle um so mehr aufgehellt, das man dies sher stark sehen kann:
http://www9.picfront.org/picture/BTTBEbBkFsi/img/0000012004.png
(Das Bild ist ein wenig groß, damit man den Fehler auch genau sehen kann)
Ich habe die stellen wo sich 3 Texturen überschneiden Rot makiert, und die wo nur 2 grün.