Конференция "Media" » Direct3D [D6, WinXP]
 
  • Agent[007] (24.08.08 19:01) [0]
    Если в Direct3D треугольники отображаются лишь тогда, когда его вершины заданы по часовой стрелке относительно камеры(т.е. vNormal^vCamera > pi/2), то есть ли флажок или способ отображения его с обоих сторон. кроме двойной прорисовки с разным порядком задания вершин?
  • МистерТ (24.08.08 19:24) [1]
    Естественно есть.
    IDirect3DDevice9.SetRenderState(D3DRS_CULLMODE, xxx);
    где ххх
    D3DCULL_NONE - "с обоих сторон"
    D3DCULL_CW - "по часовой"
    D3DCULL_CCW - "против часовой"
  • Agent[007] (24.08.08 20:06) [2]
    Огромное спасибо.
  • Agent[007] (25.08.08 08:11) [3]
    А вот ещё вопрос. есть ли в d3d аналоги glPushMatrix и glPopMatrix? если да, то как изменить у полученной системы координат ось Y? чтоб она сверху вниз шла, а не снизу вверх.
  • Agent[007] (25.08.08 13:48) [4]
    в OpenGL это типа
    glTranslatef(0, Screen.Height, 0);
    glRotatef(1, 0, 0, pi);

    а как это будет в Direct3D?
  • Sapersky (25.08.08 14:58) [5]
    В D3DX есть ID3DXMatrixStack.
  • Agent[007] (27.09.08 05:55) [6]
    а будет ли действовать изменение в матрице World на объекты, рисуемые в экранных координатах. если нет, то как отобразить объект из VertexBuffer в с некоторым смещением по осям?
  • Agent[007] (27.09.08 18:49) [7]
    то есть есть допустим треугольник вершины которого записаны в VertexBuffer. И надо его отобразить со смещением по осям. т.е. аналог glTranslate для Direct3D. Но так как к экранным координатам изменения матрицами применить нельзя, то как же быть? и ещё вопросик: будет ли наложенная текстура полупрозрачной, если указать соответствующее значение альфа-канала для цвета вершин.
  • Sapersky (28.09.08 13:59) [8]
    Но так как к экранным координатам изменения матрицами применить нельзя, то как же быть?

    Залочить буфер, сдвинуть. Или, если полигонов относительно немного, проще (и скорее всего даже быстрее) рисовать без буфера, используя DrawPrimitiveUP.

    будет ли наложенная текстура полупрозрачной, если указать соответствующее значение альфа-канала для цвета вершин.

    Должна, если задать правильный blending mode.
  • Agent[007] (28.09.08 14:27) [9]
    А ты не знаешь, какой именно бленд-мод надо ставить? у меня просто книга Фленова, а там он управляет прозрачностью только изменяя цвет каждого пиксела текстуры.
  • Agent[007] (28.09.08 15:52) [10]
    И не знаешь ли, третьим параметром в DrawPrimitiveUP что идёт? Массив, указатель на него или ещё что? а то я поискал, чёт точно не нашёл...
  • Sapersky (28.09.08 16:35) [11]
    А ты не знаешь, какой именно бленд-мод надо ставить?

    Вероятно, стандартный blending mode для полигонов (поскольку альфу задаём через полигоны), что-то вроде
    SetRenderState(D3DRS_SRCBLEND, DWord(D3DBLEND_SRCALPHA));
    SetRenderState(D3DRS_DESTBLEND, DWord(D3DBLEND_INVSRCALPHA));

    И не знаешь ли, третьим параметром в DrawPrimitiveUP что идёт

    function DrawPrimitiveUP(PrimitiveType: TD3DPrimitiveType; PrimitiveCount: LongWord; const pVertexStreamZeroData; VertexStreamZeroStride: LongWord): HResult; stdcall;

    Массив вершин. Но объявлен он как нетипизированные данные (что-то вроде "Pointer^"), т.к. вершины могут быть разного типа. Если нужно передать указатель - добавляем ^.
  • Agent[007] (28.09.08 20:29) [12]
    Огромное спасибо. но всё, что я нашёл в нете, это сабжи о неэффективности этого метода... :( ты не знаешь как ещё можно перемещать 2д объекты в Д3Д? просто менюшку ща пишу... а без этого никак... :)
  • Agent[007] (28.09.08 22:18) [13]
    как я понял, есть ещё какой-то динамический VertexBuffer... но что это за фрукт и с чем его едят... А Фленов о нём даже не заикнулся... подскажи, если знаешь...
  • Agent[007] (29.09.08 08:10) [14]
    как я понял, там каждый раз при изменении координат надо делать Lock, Move, Unlock. Или нет?
  • Agent[007] (29.09.08 10:14) [15]
    и будет ли при этом всё работать без тормозов, если у меня допустим 5 dynVB и каждый из них рисуется и изменяется по 3-5 раз за кадр?
  • Sapersky (29.09.08 15:22) [16]
    но всё, что я нашёл в нете, это сабжи о неэффективности этого метода...

    Если тысяча и более полигонов, особенно статических или модифицируемых шейдером (их можно хранить в видеопамяти, а не гонять через шину на каждом кадре) - лучше VB.
    Если полигонов мало (менюшки) и они часто меняются - лучше UP-функции. Точнее, если выводить элементы менюшки по-простому, каждый отдельно - быстрее UP; если сгруппировать все полигоны в один буфер, установить им одну текстуру и вывести за 1 вызов - может быть динамический VB окажется лучше.
    ИМХО, для начала менюшку можно сделать через UP, это проще. А потом уже, если будет невозможно тормозить (что вряд ли) - возиться с оптимизацией.

    как я понял, есть ещё какой-то динамический VertexBuffer...

    В общем-то такой же VB, но оптимизированный для частых блокировок. Создаётся с флагом D3DUSAGE_DYNAMIC, блокировка делается с флагами D3DLOCK_DISCARD или D3DLOCK_NOOVERWRITE.
    http://msdn.microsoft.com/en-us/library/bb147263(VS.85,printer).aspx#Using_Dynamic_Vertex_and_Index_Buffers
  • Agent[007] (29.09.08 21:44) [17]
    огромное спасибо... ты мне очень помог... жаль не могу тебя ни чем отблагодарить, разве что сказать ещё раз ОТ ДУШИ БЛАГОДАРЮ...
  • Sapersky (30.09.08 15:14) [18]
    Да ладно, ничего особенного :)
    Вот, кстати, может пригодится в качестве примера использования  динамического VB для вывода 2D-графики (модуль DX_sprite.pas):
    http://sapersky.narod.ru/files/AnyDX2D_v0.6.rar

    Пример Blobs можно использовать для сравнения UP-функций с DynVB (по умолчанию включён буфер, чтобы переключить на UP - закомментировать строчку Engine.SprBufSize := SprCount div 2).
    У меня получилось следующее (P3-700/Radeon 9000):

    спрайты:  2048 шт. (мелкие) 256 шт. (крупные)  
    UP   94    344
    Dynamic VB  400   346

    Т.о. VB быстрее, но заметно это только при использовании большого кол-ва мелких спрайтов, которые слабо грузят fillrate (скорость закраски) карты, так что overhead от пересылки спрайтов в видеопамять становится заметным. Если выводить немного, но крупных - они грузят карту так, что разницы между буфером и UP практически нет.
  • Agent[007] (30.09.08 17:44) [19]
    понятно... спасибо... мне в меню много и не надо... максимум 500... просто некоторые элементы будут из 18 треугольников... т.е. 9 прямоугольников... центр и по краям. так при изменении размера элемента не будет обычного масштабирования... например списки... ещё раз спасибо. к сожалению пример посмотреть не могу... ближайшие 7 месяцев. дембель тока в мае. я ща пока наброски делаю... вот и спрашиваю такую элементарщину. КСФ в лице меня объявляет благодарность.:)
 
Конференция "Media" » Direct3D [D6, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.001]