2D в D3D

Тема в разделе "WASM.DirectX", создана пользователем _220, 29 июн 2006.

  1. _220

    _220 New Member

    Публикаций:
    0
    В общем мне надо нарисовать интерфес и курсор, можо было бы сделать и в 3д, но тогда всю эту многовертексную махину пришлось бы крутить, а у меня и без того код корявый, нельзя ли как-нибудь в задний буфер просто рисовать? Кстати, как можно немедленно узнать позицию мыши(что-нибудь вроде invoke MouseGetPoint,add point), без собщений, а то мне надо всего 1 раз в начале узнать где ента мышь, а потом неохота каждый раз вынимать ненужные сообщения.
     
  2. LocTb

    LocTb New Member

    Публикаций:
    0
    1. Используй D3DFVF_XYZRHW

    2. IDirectInputDevice8::GetDeviceState
     
  3. keYMax

    keYMax New Member

    Публикаций:
    0
    Можно получить указатель на бэкбуфер с помощью GetBackBuffer и писать туда напрямую, правда тормоза будут



    Лучше квадами выводит по два треугольника с текстурой при формате вершины XYZRHW



    Методы SetCursor,SetCursorProperties,ShowCursor интерфейса IDirect3DDevice9 якобы эмулируют отображение курсора в приложение d3d но я никогда ими не пробовал пользоваться
     
  4. _220

    _220 New Member

    Публикаций:
    0
    А че за формат такой, ентот ваш D3DFVF_XYZRHW? Если выводить квадами, то их крутить надо будет, или это формат такой особенный? Кстати, причем тут GetDeviceState? Нет, ведь рисуют же как-то интерфейс в 3D играх, такая неизученная область что-ли?
     
  5. keYMax

    keYMax New Member

    Публикаций:
    0
    Формат D3DFVF_XYZRHW представляет собой набор параметеров вершины, таких как: X,Y и Z координата, причем HRW указывает на то, что вершины уже трансформированы (т.е к ним не нужно применять матрицы проекции и вида). x,y содержат числа в пикселях, а z требуется устанавливать в 1.0. Итогом является то, что выводимые треугольники (два треугольника -> квадрат) будут иметь размеры в точности такие какие были описаны и натянутая на них текстура не будет искажена. таким образом выводятся составляющие интерфейса в подавляющем большинстве приложений.



    Есть вариант вывода интерфейса через спрайты. Но это имхо как кому удобнее.



    GetDeviceState в DirectInput возвращает в буфер состояние клавиш и курсора мыши или клавиатуры в момент вызова. Но чтобы воспоспользоваться этим методом требуется создать устройство directinput, что не есть лучший выход для того чтобы один раз узнать где находится мышь перед запуском.



    Почему нельзя вызвать winapi GetCursorPos?
     
  6. _220

    _220 New Member

    Публикаций:
    0
    Вау, мне бы такого учителя блин в школке. Ну да ладно, короче говоря D3DFVF_XYZRHW - это фактически 2D вершина, как я понял, все ясно. С DirectInput я работаю в относительном режиме, мне для этого и надо узнать начальную позицию, хотелось бы, чтобы мой новый курсор появлялся на месте старого, т.к. моё приложение может работать и в окне.GetCursorPos вроде поможет, а параметры там какие?
     
  7. keYMax

    keYMax New Member

    Публикаций:
    0
    GetCursorPos передается один параметр, указатель на структуру Point, в которую и будут размещены координаты после вызова этой функции. Координаты будут экранные.
     
  8. _220

    _220 New Member

    Публикаций:
    0
    ОК, все ясно как никогда.
     
  9. _220

    _220 New Member

    Публикаций:
    0
    Практика обнаружила отклонение от теории(в моем ее понимании).Пишу так:



    INTERFACE_VERTEX equ D3DFVF_XYZRHW or D3DFVF_TEX1

    InterfaceVertex struc

    x dd ?

    y dd ?

    z dd ?

    tx dd ?

    ty dd ?

    InterfaceVertex ends

    <...........................................>

    ivb dd 0; Interface vertex buffer

    mpvs InterfaceVertex <100.0f,100.0f,1.0f,0.0f,0.0f>

    InterfaceVertex <131.0f,100.0f,1.0f,1.0f,0.0f>

    InterfaceVertex <131.0f,131.0f,1.0f,1.0f,1.0f>

    InterfaceVertex <100.0f,100.0f,1.0f,0.0f,0.0f>

    InterfaceVertex <131.0f,131.0f,1.0f,1.0f,1.0f>

    InterfaceVertex <100.0f,131.0f,1.0f,0.0f,1.0f>

    <...........................................>

    d3dev8 CreateVertexBuffer,g_pd3ddev,(6)*(type InterfaceVertex),D3DUSAGE_WRITEONLY,INTERFACE_VERTEX,D3DPOOL_MANAGED,a ddr ivb

    d3dvb8 Lock1,ivb,0,6,addr mpbuf,0

    lea esi,mpvs

    mov edi,mpbuf

    mov ecx,6 * (type InterfaceVertex)/4

    rep movsd

    d3dvb8 Unlock,ivb

    <...........................................>

    d3dev8 SetStreamSource,g_pd3ddev,0,ivb,type InterfaceVertex

    d3dev8 SetVertexShader,g_pd3ddev,INTERFACE_VERTEX

    d3dev8 SetTexture,g_pd3ddev,0, ptex

    d3dev8 DrawPrimitive,g_pd3ddev,D3DPT_TRIANGLELIST,0,2



    Рисуется все где надо, но текстура как-то совсем не так отображается, причем по-разному в обоих треугольниках(хотя сама в порядке)
     
  10. _220

    _220 New Member

    Публикаций:
    0
    Разобрался. Я забыл про само поле RHW. Сейча не могу понять только почему у меня раньше воообще что-то работало.