-
Возникла проблема с Direct3d на новых карточках ATI x2000. Использовалл Direct3d для вывода двумерных графиков и рисования некоторых дополнительных "красивостей". Возникла проблема с этими "красивостями", почему-то перестала работать закраска градиентом, т.е. треугольники стали рисоваться одноцветными. Самому мне кажеться, что опция закраски градиентом перестала включаться по умолчанию. Но как её включить не знаю.
-
дак а что тебе мешает явно задать цвета вершин треугольников?
-
Цвета заданы явно. Но градиентная заливка не происходит. Похоже на эффект режима GL_FLAT в OpenGL
-
Вообще-то не должны настройки по умолчанию зависеть от карты. Хотя с кривыми драйверами всё может быть. Включить: SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); Также можно попробовать D3DRS_COLORVERTEX (вкл.), D3DRS_LIGHTING (выкл.).
-
Спасибо. Попробую.
-
к сожалению не вышло код инициализации 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;
-
Честно говоря, такой псевдо-OpenGL код вижу первый раз в жизни (это т.н. managed DX? или какой-то дополнительный класс?) Могу посоветовать только найти пример, в котором цветовая интерполяция работает, и делать как там. Например, см. папку Demo в заголовках от Clootie.
-
Это класс-обёртка. Сделал сам чтобы упростить 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. По видимому раньше эта ошибка прощалась и я не обращал на неё внимания. Большое спасибо за поддержку.
|