Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возникла проблема с Direct3d на новых карточках ATI x2000 [Delphi, Windows]


bioSerg ©   (2007-10-09 10:41:00) 

Возникла проблема с Direct3d на новых карточках ATI x2000.
Использовалл Direct3d для вывода двумерных графиков и рисования некоторых дополнительных "красивостей". Возникла проблема с этими "красивостями", почему-то перестала работать закраска градиентом, т.е. треугольники стали рисоваться одноцветными.
Самому мне кажеться, что опция закраски градиентом перестала включаться по умолчанию. Но как её включить не знаю.


bioSerg   (2007-10-18 07:46:00) [1]

Это класс-обёртка. Сделал сам чтобы упростить 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.
По видимому раньше эта ошибка прощалась и я не обращал на неё внимания.

Большое спасибо за поддержку.


Sapersky   (2007-10-17 20:14:00) [2]

Честно говоря, такой псевдо-OpenGL код вижу первый раз в жизни (это т.н. managed DX? или какой-то дополнительный класс?)
Могу посоветовать только найти пример, в котором цветовая интерполяция работает, и делать как там. Например, см. папку Demo в заголовках от Clootie.


bioSerg   (2007-10-17 14:10:00) [3]

к сожалению не вышло

код инициализации
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;


bioSerg   (2007-10-10 08:59:00) [4]

Спасибо. Попробую.


Sapersky   (2007-10-09 19:24:00) [5]

Вообще-то не должны настройки по умолчанию зависеть от карты. Хотя с кривыми драйверами всё может быть.
Включить:
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Также можно попробовать D3DRS_COLORVERTEX (вкл.), D3DRS_LIGHTING (выкл.).


bioSerg   (2007-10-09 11:37:00) [6]

Цвета заданы явно.
Но градиентная заливка не происходит.
Похоже на эффект режима GL_FLAT в OpenGL


RzCoDer   (2007-10-09 11:32:00) [7]

дак а что тебе мешает явно задать цвета вершин треугольников?


Наверх

Титульная страница Поиск, карта сайта Написать письмо