Форум: "Игры";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];
ВнизВозникла проблема с Direct3d на новых карточках ATI x2000 Найти похожие ветки
← →
bioSerg (2007-10-09 10:41) [0]Возникла проблема с Direct3d на новых карточках ATI x2000.
Использовалл Direct3d для вывода двумерных графиков и рисования некоторых дополнительных "красивостей". Возникла проблема с этими "красивостями", почему-то перестала работать закраска градиентом, т.е. треугольники стали рисоваться одноцветными.
Самому мне кажеться, что опция закраски градиентом перестала включаться по умолчанию. Но как её включить не знаю.
← →
RzCoDer © (2007-10-09 11:32) [1]дак а что тебе мешает явно задать цвета вершин треугольников?
← →
bioSerg (2007-10-09 11:37) [2]Цвета заданы явно.
Но градиентная заливка не происходит.
Похоже на эффект режима GL_FLAT в OpenGL
← →
Sapersky (2007-10-09 19:24) [3]Вообще-то не должны настройки по умолчанию зависеть от карты. Хотя с кривыми драйверами всё может быть.
Включить:
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
Также можно попробовать D3DRS_COLORVERTEX (вкл.), D3DRS_LIGHTING (выкл.).
← →
bioSerg (2007-10-10 08:59) [4]Спасибо. Попробую.
← →
bioSerg (2007-10-17 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 (2007-10-17 20:14) [6]Честно говоря, такой псевдо-OpenGL код вижу первый раз в жизни (это т.н. managed DX? или какой-то дополнительный класс?)
Могу посоветовать только найти пример, в котором цветовая интерполяция работает, и делать как там. Например, см. папку Demo в заголовках от Clootie.
← →
bioSerg (2007-10-18 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.
По видимому раньше эта ошибка прощалась и я не обращал на неё внимания.
Большое спасибо за поддержку.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2012.05.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c