[C#] Ciężkie początki z directX -em.

1

No dobra. Poddaje się. Mam dość. Ale od początku:

Parę tygodni temu postanowiłem zainteresować się directX -em. Jako tutorial wybrałem oczywiście ten z naszej strony. Wykonałem pierwsze 3 kroki - wszystko działało dobrze. W 4 kroku jednak, (wykorzystanie tekstur) pojawił się ZONK. Błąd, znaczy się. Nie tyle błąd kompilacji - z tym można byłoby walczyć, siłować się z komputerem, próbować nowych ścieżek, i tak dalej. Wszystko uruchamia się pięknie, tyle że... Na kwadracie w którym wyświetlam teksturę pojawia się nie owa tekstura ale LEWY GÓRNY wierzchołek obrazka, zamiast cały. Żeby nie przedłużać - kod klasy TDirectX:

<font size="2"> ``` using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; using System.ComponentModel;

namespace Program
{
class TDirectX
{
private Device device;
private Control parent;
private CustomVertex.TransformedTextured[] vertex;
private Texture texture;

    public TDirectX(Control parent, bool windowed)
    {
        try
        {
            this.parent = parent;

            PresentParameters presentParameters = new PresentParameters();
            presentParameters.Windowed = windowed;
            presentParameters.SwapEffect = SwapEffect.Discard;
            if (!windowed)
            {
                presentParameters.FullScreenRefreshRateInHz = 60;
                presentParameters.BackBufferWidth = 800;
                presentParameters.BackBufferHeight = 600;
                presentParameters.BackBufferCount = 1;
                presentParameters.BackBufferFormat = Format.X8R8G8B8;
                presentParameters.PresentFlag = PresentFlag.None;
            }

            device = new Device(0, DeviceType.Hardware, parent, CreateFlags.SoftwareVertexProcessing, presentParameters);
            device.DeviceLost += new EventHandler(this.InvalidateDeviceObjects);
            device.DeviceReset += new EventHandler(this.RestoreDeviceObjects);
            device.Disposing += new EventHandler(this.DeleteDeviceObjects);
            device.DeviceResizing += new CancelEventHandler(this.EnvironmentResizing);

            Initialize();

        }
        catch
        {
            MessageBox.Show("konstruktor");
        }
    }


    private void Initialize()
    {
        vertex = new CustomVertex.TransformedTextured[4];

        vertex[0].X = 0;
        vertex[0].Y = 0;
        vertex[0].Z = 0;
        vertex[0].Tu = 0;
        vertex[0].Tv = 0;

        vertex[1].X = 227;
        vertex[1].Y = 0;
        vertex[1].Z = 0;
        vertex[1].Tu = 1;
        vertex[1].Tv = 0;

        vertex[2].X = 0;
        vertex[2].Y = 264;
        vertex[2].Z = 0;
        vertex[2].Tu = 0;
        vertex[2].Tv = 1;

        vertex[3].X = 227;
        vertex[3].Y = 264;
        vertex[3].Z = 0;
        vertex[3].Tu = 1;
        vertex[3].Tv = 1;

        System.IO.Stream stream = new System.IO.FileStream(@"C:\Documents and Settings\jarek\Moje dokumenty\Moje obrazy\Darkness.bmp", System.IO.FileMode.Open);
        texture = new Texture(device, stream, Usage.Dynamic, Pool.Default);
        stream.Dispose();
    }

    public void Render(float time)
    {
        try
        {
            device.Clear(ClearFlags.Target, Color.Blue, 1.0f, 0);
            device.BeginScene();

            device.SetTexture(0, texture);
            device.VertexFormat = CustomVertex.TransformedTextured.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleStrip, 2, vertex);

            device.EndScene();
            device.Present();
        }
        catch
        {
            MessageBox.Show("Render");
        }
    }

    #region Zdarzenia
    protected virtual void InvalidateDeviceObjects(object sender, EventArgs e)
    {
    }

    protected virtual void RestoreDeviceObjects(object sender, EventArgs e)
    {
        texture.Dispose();
        Initialize();
    }

    protected virtual void DeleteDeviceObjects(object sender, EventArgs e)
    {
    }

    protected virtual void EnvironmentResizing(object sender, CancelEventArgs e)
    {
    }
    #endregion
}

}

</span>

Mam nadzieję że ktoś to przeczyta, i nie będę musiał odpowiadać np. na pytania czy ustawiłem Tu i Tv  :d 

Szukałem już wszędzie - w msdn i wszelakich tutorialach, u google, wszędzie no. Podobny problem znalazłem tylko u jednej osoby (<a href="http://forum.gamedev.pl/index.php?topic=11286.0">http://forum.gamedev.pl/index.php?topic=11286.0</a>), ale tam też nikt nie podał rozwiązania

Aha, jeszcze tylko 2 uwagi:
1 - ściągnąłem też cały plik dołączony do kursu -> też nie działa i 
2 - testowałem na komputerze brata -> (oczywiście) też nie działa. To już 2 komputery.

EDIT: Napisałem że znalazłem tylko jeden taki problem - mówiłem o stronach w jęz. polskim bo w angielskim nie wiedziałem jak wpisać "jednolita" albo coś w tym rodzaju.
0

U mnie, na zupelnie swiezym systemie dziala jak trzeba. Sprobuj, jak opisano w kroku 3. wszystkim wierzcholkom ustawic RHW na 1.0 (albo bezposrednio, albo jaka czwarta wspolrzedna wektora Position). Daj znac, czy pomoglo.

1

Działa. o.0 (???)

Kiedy wszystko zadziałało przeżyłem szok. Nie wiązałem bowiem z tym większych nadziei i już obmyślałem odpowiednią odpowiedź "nie" ^^.

Pozostają jednak 2 sprawy: Czemu nie jest tak napisane w tym przykładzie (krok 4), ani nigdzie indziej w internecie? Mój komputer jest aż taki wyjątkowy? ;)
I czemu #() to działa??? cytuję: Ponieważ jako typ wierzchołków wybraliśmy wierzchołki ekranowe, opisane kolorem (...) RHW (reciprocal homogenous W; współczynnik skalowania, zwykle równy 1) - w kroku 4 ani słowa o RHW (Edycja - Znajdź)? Naprawde jestem ciekawy, czemu to u mnie działa inaczej niż u was

0

Bo to byl moj artykul i jak ktos zglosil, ze krok 3. mu nie dziala to poprawilem; nikt mi nie zglaszal, ze 4. nie dziala (a u mnie chodzi jak trzeba).

1

Wiem, widziałem że jesteś ostatnim autorem :)

Tym niemniej: dzięki. Mogę wrócić do kursu i dalej rozwijać mój program ;)

0

Nie tylko ostatnim, ale - z wyjatkami poprawek literowek - jedynym. Niemniej ciesze sie, ze dziala. Jakbys mial jeszcze inne problemy z kodami, komentuj moze pod artykulami, w ten sposob nie zgubie w gestwinie forumowych postow. Milej zabawy z DX!

1 użytkowników online, w tym zalogowanych: 0, gości: 1