На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Драйвера для видеокарты AMD Radeon R7, Прозрачность объектов и свойства эмиссии
    Добрый день! На RAD Studio 10.3 и GLScene 1.8 я создал проект с двумя формами и возникла проблема добавления точек в куб и сферу, у которых я прописал BlendingMode в bmAdditive. Сначала точки выходили за поверхность объектов, но после уменьшения диапазона генерации координат оказалось, что хотя я вижу пересечение осей у куба и сферы, точки появляются только при очень сильном увеличении, когда грани объектов "проламываются". У пользователя Fosgen (http://delphimaster.net/view/9-1120384424) я нашёл четыре способа установления прозрачности в зависимости от типа видеокарты, но для видеокарты AMD Radeon R7 ни один из них не подошёл. Вдобавок, во втором способе при изменении эмиссии голубого цвета возникла назойливая ошибка, не дающая закрыть программу, а свойство NoZWrite не отображалось в инспекторе объектов для куба. Для какого объекта надо прописывать это свойство? Какие драйвера нужны для AMD Radeon R7, чтобы мой ноут наконец-то "потянул" эти непокорные свойства эмиссии для текстуры объекта, а куб и сфера стали прозрачными (и поверхности фигур видны, и точки через них просвечивались)? Не хочу потрошить торрент-трекеры в поисках сомнительных программ и постоянно натыкаться на фишинговые программы, кейлоггеры, винлокеры и прочую "нечисть", поэтому, если знаете проверенную ссылку, кидайте в тему. Как можно сделать куб и сферу прозрачными в обход свойств текстуры и эмиссии, чтобы при этом и поверхности самих объектов, и точки внутри них были видны?

    Исходный код первой формы:
    ExpandedWrap disabled
      unit Lab1;
       
      interface
       
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, GLScene, GLCoordinates, GLObjects, GLKeyboard, Math,
        GLWin32Viewer, GLCrossPlatform, GLBaseClasses, GLGeomObjects, Vcl.StdCtrls,
        GLCadencer, GLNavigator;
       
      type
        TForm1 = class(TForm)
          GLScene1: TGLScene;
          GLSceneViewer1: TGLSceneViewer;
          GLCube1: TGLCube;
          GLCamera1: TGLCamera;
          GLLightSource1: TGLLightSource;
          GLCamera2: TGLCamera;
          GLTorus1: TGLTorus;
          GLLightSource2: TGLLightSource;
          Button1: TButton;
          Button2: TButton;
          GLCadencer1: TGLCadencer;
          GLCamera3: TGLCamera;
          Button3: TButton;
          Button4: TButton;
          procedure Button1Click(Sender: TObject);
          procedure Button2Click(Sender: TObject);
          procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
            newTime: Double);
          procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
            Shift: TShiftState; X, Y: Integer);
          procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
            Y: Integer);
          procedure Button3Click(Sender: TObject);
          procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
            WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
          procedure Button4Click(Sender: TObject);
        private
          { Private declarations }
        public
          mx,my: Integer;
        end;
        Coordinates = record
           X,Y,Z: double;
        end;
      var
        Form1: TForm1;
        CubeObject: TGLCube;
        SphereObject: TGLSphere;
        dx,dy,dz: Integer;
      implementation
       
      {$R *.dfm}
       
      uses Lab2;
       
      procedure TForm1.Button1Click(Sender: TObject);
      begin
         GLSceneViewer1.Camera:=GLCamera1;
         Button1.Enabled:=False;
         Button2.Enabled:=True;
         Button3.Enabled:=True;
      end;
       
      procedure TForm1.Button2Click(Sender: TObject);
      begin
         GLSceneViewer1.Camera:=GLCamera2;
         Button2.Enabled:=False;
         Button1.Enabled:=True;
         Button3.Enabled:=True;
      end;
       
      procedure TForm1.Button3Click(Sender: TObject);
      begin
         GLSceneViewer1.Camera:=GLCamera3;
         Button3.Enabled:=False;
         Button1.Enabled:=True;
         Button2.Enabled:=True;
      end;
       
      procedure TForm1.Button4Click(Sender: TObject);
      begin
      Form2.Visible:=True;
      Visible := False;
      end;
       
      procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
        WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
      begin
      if(GLSceneViewer1.MouseInControl=true) then GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120))
      end;
       
      procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
        newTime: Double);
      begin
      GLCube1.Turn(deltaTime*10);
      GLTorus1.Turn(deltaTime*10);
      //Движение вперед по клавишам ‘ц’ и’ w’
      if (IsKeyDown('ц') OR IsKeyDown('w')) then GLSceneViewer1.Camera.Move(2* deltaTime);
      //Движение назад по клавишам ‘ы’ и ‘s’
      if (IsKeyDown('ы') OR IsKeyDown('s')) then GLSceneViewer1.Camera.Move(-2* deltaTime);
      //Поворот влево по клавишам ‘ф’ и’ a’
      if (IsKeyDown('ф') OR IsKeyDown('a')) then GLSceneViewer1.Camera.slide(-2* deltaTime);
      //Поворот вправо по клавишам ‘в’ и ‘d’
      if (IsKeyDown('в') OR IsKeyDown('d')) then GLSceneViewer1.Camera.slide(2* deltaTime);
      //Движение вверх по клавишам ‘u’ и ‘г’
      if (IsKeyDown('u') OR IsKeyDown('г')) then GLSceneViewer1.Camera.Lift(0.01);
      //Движение вниз по клавишам ‘n’ и ‘т’
      if (IsKeyDown('n') OR IsKeyDown('т')) then GLSceneViewer1.Camera.Lift(-0.01);
      if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1;
      if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2;
      if (IsKeyDown('b') OR IsKeyDown('и')) then GLSceneViewer1.Camera:=GLCamera3
      end;
       
      procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
      begin
        mx:=x; my:=y; //Запомнить координаты мыши
      end;
       
      procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
        Y: Integer);
      begin
        if Shift<>[] then begin //Если нажата клавиша
        GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта
        GLLightSource1.Position:=GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой
        mx:=x; my:=y;
        end;
      end;
       
      end.


    Код второй формы:
    ExpandedWrap disabled
      unit Lab2;
       
      interface
       
      uses
        Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
        Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Lab1, Vcl.StdCtrls, GLWin32Viewer, GLKeyboard, Math,
        GLCrossPlatform, GLBaseClasses, GLScene, GLObjects, GLCoordinates, GLCadencer,
        Vcl.ComCtrls;
       
      type
        TForm2 = class(TForm)
          GLScene1: TGLScene;
          GLSceneViewer1: TGLSceneViewer;
          Button1: TButton;
          GLCadencer1: TGLCadencer;
          GLCamera1: TGLCamera;
          GLLightSource1: TGLLightSource;
          GLCube1: TGLCube;
          GLSphere1: TGLSphere;
          GLCamera2: TGLCamera;
          Button2: TButton;
          Button3: TButton;
          Button4: TButton;
          TrackBar1: TTrackBar;
          TrackBar2: TTrackBar;
          TrackBar3: TTrackBar;
          procedure Button1Click(Sender: TObject);
          procedure GLCube1Progress(Sender: TObject; const deltaTime,
            newTime: Double);
          procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
            WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
          procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
            Shift: TShiftState; X, Y: Integer);
          procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
            Y: Integer);
          procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
            newTime: Double);
          procedure Button2Click(Sender: TObject);
          procedure Button3Click(Sender: TObject);
          procedure TrackBar1Change(Sender: TObject);
          procedure TrackBar2Change(Sender: TObject);
          procedure TrackBar3Change(Sender: TObject);
          procedure Button4Click(Sender: TObject);
          procedure FormClose(Sender: TObject; var Action: TCloseAction);
        private
          { Private declarations }
        public
          mx,my: Integer;
        end;
       
      var
        Form2: TForm2;
       
      implementation
       
      {$R *.dfm}
       
      procedure TForm2.Button1Click(Sender: TObject);
      begin
      Form1.Visible:=True;
      Form2.Visible:=False;
      end;
       
      procedure TForm2.Button2Click(Sender: TObject);
      begin
         Form2.GLSceneViewer1.Camera:=Form2.GLCamera1;
         Form2.Button2.Enabled:=False;
         Form2.Button3.Enabled:=True;
      end;
       
      procedure TForm2.Button3Click(Sender: TObject);
      begin
         Form2.GLSceneViewer1.Camera:=Form2.GLCamera2;
         Form2.Button3.Enabled:=False;
         Form2.Button2.Enabled:=True;
      end;
       
      procedure TForm2.Button4Click(Sender: TObject);
      var
        i: Integer;
        Pt: TGLPoints;
      begin
      For i := 1 To 1000 Do
        Begin
        Pt := TGLPoints.Create(GLSceneViewer1.Camera.TargetObject);
        Pt.Colors.Add(RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, RandomRange(0, 1000) / 1000, 0.5);
        Pt.Size := 5;
        Pt.Position.X := RandomRange(-500, 500) / 1000;
        Pt.Position.Y := RandomRange(-500, 500) / 1000;
        Pt.Position.Z := RandomRange(-500, 500) / 1000;
        GLSceneViewer1.Camera.TargetObject.AddChild(Pt); // Вот, дописал наугад, теперь вроде работает.
        End;
      end;
       
      procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
      begin
      Application.MainForm.Close();
      end;
       
      procedure TForm2.FormMouseWheel(Sender: TObject; Shift: TShiftState;
        WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
      begin
      if(Form2.GLSceneViewer1.MouseInControl=true) then Form2.GLSceneViewer1.Camera.AdjustDistanceToTarget(Power(1.1,-WheelDelta/120))
      end;
       
      procedure TForm2.GLCadencer1Progress(Sender: TObject; const deltaTime,
        newTime: Double);
      begin
      //Движение вперед по клавишам ‘ц’ и’ w’
      if (IsKeyDown('ц') OR IsKeyDown('w')) then Form2.GLSceneViewer1.Camera.Move(2* deltaTime);
      //Движение назад по клавишам ‘ы’ и ‘s’
      if (IsKeyDown('ы') OR IsKeyDown('s')) then Form2.GLSceneViewer1.Camera.Move(-2* deltaTime);
      //Поворот влево по клавишам ‘ф’ и’ a’
      if (IsKeyDown('ф') OR IsKeyDown('a')) then Form2.GLSceneViewer1.Camera.slide(-2* deltaTime);
      //Поворот вправо по клавишам ‘в’ и ‘d’
      if (IsKeyDown('в') OR IsKeyDown('d')) then Form2.GLSceneViewer1.Camera.slide(2* deltaTime);
      //Движение вверх по клавишам ‘u’ и ‘г’
      if (IsKeyDown('u') OR IsKeyDown('г')) then Form2.GLSceneViewer1.Camera.Lift(0.01);
      //Движение вниз по клавишам ‘n’ и ‘т’
      if (IsKeyDown('n') OR IsKeyDown('т')) then Form2.GLSceneViewer1.Camera.Lift(-0.01);
      if (IsKeyDown('c') OR IsKeyDown('с')) then GLSceneViewer1.Camera:=GLCamera1;
      if (IsKeyDown('v') OR IsKeyDown('м')) then GLSceneViewer1.Camera:=GLCamera2
      end;
       
      procedure TForm2.GLCube1Progress(Sender: TObject; const deltaTime,
        newTime: Double);
      begin
      Form2.GLCube1.TurnAngle:=Form2.GLCube1.TurnAngle + deltaTime * 100;
      end;
       
      procedure TForm2.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
      begin
        mx:=x; my:=y; //Запомнить координаты мыши
      end;
       
      procedure TForm2.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
        Y: Integer);
      begin
        if Shift<>[] then begin //Если нажата клавиша
        Form2.GLSceneViewer1.Camera.MoveAroundTarget(my-y, mx-x); //Перемещаем камеру вокруг целевого объекта
        Form2.GLLightSource1.Position:=Form2.GLSceneViewer1.Camera.Position; //Пусть источник освещения будет рядом с камерой
        mx:=x; my:=y;
        end;
      end;
       
      procedure TForm2.TrackBar1Change(Sender: TObject);
      begin
      Form2.GLSceneViewer1.Camera.TargetObject.PitchAngle:=TrackBar1.Position;
      end;
       
      procedure TForm2.TrackBar2Change(Sender: TObject);
      begin
      Form2.GLSceneViewer1.Camera.TargetObject.RollAngle:=TrackBar2.Position;
      end;
       
      procedure TForm2.TrackBar3Change(Sender: TObject);
      begin
      Form2.GLSceneViewer1.Camera.TargetObject.TurnAngle:=TrackBar3.Position;
      end;
       
      end.


    Добавлено
    Вот окно ошибки. Архив с проектом грузите отсюда:
    http://www.cyberforum.ru/delphi-multimedia...ml#post13844097
    Сообщение отредактировано: iVovan1996 -

    Прикреплённая картинка
    Прикреплённая картинка
      Прикреплённая картинка
      Прикреплённая картинка


      Добавлено
      Ссылка на непоместившееся изображение:
      http://www.cyberforum.ru/attachments/1068373d1569083895
        Препод сказал - вывести куб и выставить Ambient.Alpha во фронтах в 0,5. Я вернул первоначальный BlendingMode, а потом сделал это сначала через инспектор объектов, а потом через событие OnCreate для второй формы, но это не помогло.

        ExpandedWrap disabled
          procedure TForm2.FormCreate(Sender: TObject);
          begin
          Form2.GLCube1.Material.FrontProperties.Ambient.Alpha:=0.5;
          Form2.GLSphere1.Material.FrontProperties.Ambient.Alpha:=0.5;
          end;


        То же самое через первую форму дало ошибку.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,1180 ]   [ 21 queries used ]   [ Generated: 12.11.19, 20:50 GMT ]