Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2011, 14:30   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию Затенение объекта в Direct3D

Наблюдаю весьма любопытный факт при работе с Direct3D в Delphi:



Почему же правый верхний угол немного затенённый?

Вот код.....

Инициализация Direct3D....

Код:
Function InitEngine3D(Handle : THandle):HResult;stdcall;
Var
    Params : TD3DPresentParameters;
    Mode   : TD3DDisplayMode;
Begin
      Result:=E_FAIL;
      Engine:=Direct3DCreate9(D3D_SDK_VERSION);
      If Engine = Nil Then Exit;
      Result:=Engine.GetAdapterDisplayMode(D3DADAPTER_DEFAULT,Mode);
      If Failed(Result) Then Exit;
      ZeroMemory(@Params,SizeOf(Params));
      Params.Windowed:=True;
      Params.SwapEffect:=D3DSWAPEFFECT_DISCARD;
      Params.BackBufferFormat:=Mode.Format;
      Params.EnableAutoDepthStencil:=True;
      Params.AutoDepthStencilFormat:=D3DFMT_D16;
      Result:=Engine.CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
      Handle,D3DCREATE_SOFTWARE_VERTEXPROCESSING,@Params,Device);
      EHandle:=Handle;
      Device.SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
      Device.SetRenderState(D3DRS_LIGHTING,0);
      Device.SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
      SetupCamera;
End;
Установка камеры...(SetupCamera)

Код:
Procedure SetupCamera;stdcall;
Var
    ViewMatrix : TD3DMatrix;
    ProjectionMatrix : TD3DMatrix;
    Eye , At , Up : TD3DVector;
Begin
      Eye.x:=0; Eye.y:=0; Eye.z:=-3;
      At.x:=0; At.y:=0; At.z:= 0;
      Up.x:=0;Up.y:=1; Up.z:=0;
      D3DXMatrixLookAtLH(ViewMatrix,Eye,At,Up);
      Device.SetTransform(D3DTS_VIEW,ViewMatrix);
      D3DXMatrixPerspectiveFovLH(ProjectionMatrix,D3DX_PI/4,1,1,100);
      Device.SetTransform(D3DTS_PROJECTION,ProjectionMatrix);
End;
Очистка устройства

Код:
Procedure ClearEngine3D;stdcall;
Begin
      If Device = Nil Then Exit;
      Device.Clear(0,nil,D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,
      D3DCOLOR_XRGB(0,0,0),1,0);
End;
Переключение буферов

Код:
Procedure EnginePresent3D;stdcall;
Begin
      Device.Present(nil,nil,0,nil);
End;
Подготовка вершин

Код:
Procedure PrepareSAME3D;stdcall;
Var
    pPyr : Pointer;
    Tris : array[0..5] of TSAMEPoint3D;
Begin
      Device.CreateVertexBuffer(SizeOf(Tris),0,SAMEEngine_POINT3D,
      D3DPOOL_DEFAULT,SAMEVertexBuffer,nil);
      Tris[0].x:=-1;
      Tris[0].y:=1;
      Tris[0].z:=0;
      Tris[0].Color:=$00FF00;
      Tris[1].x:=1;
      Tris[1].y:=1;
      Tris[1].z:=0;
      Tris[0].Color:=$00FF00;
      Tris[2].x:=1;
      Tris[2].y:=-1;
      Tris[2].z:=0;
      Tris[2].Color:=$00FF00;
      Tris[3]:=Tris[2];
      Tris[4].x:=-1;
      Tris[4].y:=-1;
      Tris[4].z:=0;
      Tris[4].Color:=$00FF00;
      Tris[5]:=Tris[0];
      SAMEVertexBuffer.Lock(0,SizeOf(Tris),pPyr,0);
      try
          CopyMemory(pPyr,@Tris,SizeOf(Tris));
      finally
          SAMEVertexBuffer.Unlock;
      end;
Рисование

Код:
Procedure DrawSAME3D;stdcall;
Begin
      ClearEngine3D;
      Device.BeginScene;
      try
          Device.SetStreamSource(0,SAMEVertexBuffer,0,SizeOf(TSAMEPoint3D));
          Device.SetFVF(SAMEEngine_POINT3D);
          Device.DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
      finally
          Device.EndScene;
      end;
      EnginePresent3D;
End;
Вот константы, типы

Код:
const
SAMEEngine_POINT3D = D3DFVF_XYZ    or D3DFVF_DIFFUSE;

type
      TSAMEPoint3D = packed record
        x , y , z : Single;
        Color : DWord;
end;

Последний раз редактировалось _-Re@l-_; 05.04.2011 в 14:32.
_-Re@l-_ вне форума Ответить с цитированием
Старый 05.04.2011, 14:40   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Вот тут опечатка:
Цитата:
Tris[0].x:=-1;
Tris[0].y:=1;
Tris[0].z:=0;
Tris[0].Color:=$00FF00;
Tris[1].x:=1;
Tris[1].y:=1;
Tris[1].z:=0;
Tris[0].Color:=$00FF00;
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 05.04.2011, 14:43   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Да, спасибо, Ulex, буквально за минуту до вашего сообщения обнаружил
Чёрт, ну надо же такие ошибки допускать Из-за этой ошибки потерял 30 минут.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ and Direct3D likstalkera Visual C++ 3 20.02.2011 13:28
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
Direct3d и BIOS eoln Компьютерное железо 0 13.08.2010 10:29
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52