Конференция "Игры" » Возникла проблема с Direct3d на новых карточках ATI x2000 [Delphi, Windows]
 
  • bioSerg (09.10.07 10:41) [0]
    Возникла проблема с Direct3d на новых карточках ATI x2000.
    Использовалл Direct3d для вывода двумерных графиков и рисования некоторых дополнительных "красивостей". Возникла проблема с этими "красивостями", почему-то перестала работать закраска градиентом, т.е. треугольники стали рисоваться одноцветными.
    Самому мне кажеться, что опция закраски градиентом перестала включаться по умолчанию. Но как её включить не знаю.
  • RzCoDer © (09.10.07 11:32) [1]
    дак а что тебе мешает явно задать цвета вершин треугольников?
  • bioSerg (09.10.07 11:37) [2]
    Цвета заданы явно.
    Но градиентная заливка не происходит.
    Похоже на эффект режима GL_FLAT в OpenGL
  • Sapersky (09.10.07 19:24) [3]
    Вообще-то не должны настройки по умолчанию зависеть от карты. Хотя с кривыми драйверами всё может быть.
    Включить:
    SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
    Также можно попробовать D3DRS_COLORVERTEX (вкл.), D3DRS_LIGHTING (выкл.).
  • bioSerg (10.10.07 08:59) [4]
    Спасибо. Попробую.
  • bioSerg (17.10.07 14:10) [5]
    к сожалению не вышло

    код инициализации
    procedure TSD3D.BeginScene;
    begin
    if FNeedResize then
    begin
      Resize;
      FNeedResize:=False;
    end;
    if FD3DDevice=NIL then
     raise Exception.Create('D3D Lock UnLock Error');
    if FAILED(FD3DDevice.Clear(0, nil, D3DCLEAR_TARGET, FClearColor, 1.0, 0)) then
     raise Exception.Create('D3D Lock UnLock Error');
    if FAILED(FD3DDevice.BeginScene) then
     raise Exception.Create('D3D Lock UnLock Error');
    FD3DDevice.SetRenderState(D3DRS_SHADEMODE,D3DSHADE_GOURAUD);
    FD3DDevice.SetRenderState(D3DRS_COLORVERTEX,iTrue);
    FD3DDevice.SetRenderState(D3DRS_LIGHTING,iFalse);
    end;


    код рисования

                 d3d.BeginDraw(D3DPT_TRIANGLEFAN);
                   d3d.SetColor($008080);
                   d3d.Vertex(LineWid,zeroy);

                   d3d.SetColor(rgb3d($00,$08*4,$08*4));
                   d3d.Vertex(0,zeroy-13);

                   for j:=24 to 31 do
                   begin
                     d3d.SetColor(rgb3d($00,$08*(abs(j-16) div 2),$08*(abs(j-16) div 2)));
                     d3d.Vertex(LineWid+cos(j/16*pi)*13,zeroy+sin(j/16*pi)*13);
                   end;
                   for j:=0 to 8 do
                   begin
                     d3d.SetColor(rgb3d($00,$08*(abs(j-16) div 2),$08*(abs(j-16) div 2)));
                     d3d.Vertex(LineWid+cos(j/16*pi)*13,zeroy+sin(j/16*pi)*13);
                   end;

                   d3d.SetColor(rgb3d($00,$08*4,$08*4));
                   d3d.Vertex(0,zeroy+13);

                   d3d.SetColor(rgb3d($00,$80,$80));
                   d3d.Vertex(0,zeroy);

                   d3d.SetColor(rgb3d($00,$08*4,$08*4));
                   d3d.Vertex(0,zeroy-13);

                 d3d.EndDraw;

  • Sapersky (17.10.07 20:14) [6]
    Честно говоря, такой псевдо-OpenGL код вижу первый раз в жизни (это т.н. managed DX? или какой-то дополнительный класс?)
    Могу посоветовать только найти пример, в котором цветовая интерполяция работает, и делать как там. Например, см. папку Demo в заголовках от Clootie.
  • bioSerg (18.10.07 07:46) [7]
    Это класс-обёртка. Сделал сам чтобы упростить 2D вывод. Нашёл "ошибку".
    Для заполнения массива 2D вершин я использовал следующий код.

    procedure TSD3D.Vertex(x, y: Single);
    var
     v1,v2 : TCUSTOMVERTEX;
     v     : Integer;
    begin
    FInternalVertex[FInternalPosition].X:=x;
    FInternalVertex[FInternalPosition].Y:=y;
    FInternalVertex[FInternalPosition].Z:=0;
    FInternalVertex[FInternalPosition].RHW:=0;
    FInternalVertex[FInternalPosition].Color:=FCurrentColor;



    Как оказалось нужно было изменить значение RHW на 1.
    По видимому раньше эта ошибка прощалась и я не обращал на неё внимания.

    Большое спасибо за поддержку.
 
Конференция "Игры" » Возникла проблема с Direct3d на новых карточках ATI x2000 [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]