Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 OpenGL просвечивание светом  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9740
Есть сцена. В центре (0, 0, 0) находится источник света. Вокруг него вращается объект. Проблема - когда объект находится между источником света и наблюдателем, этот объект просвечивается насквозь. Как бы убрать такой эффект?

+ Отрисовка
procedure TForm1.FormPaint(Sender: TObject);
const
  CLight: array [0..3] of GLfloat = (0, 0, 0, 1);
begin
  glPushMatrix;
  try
    glClearColor(0.5, 0.5, 0.75, 1);
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glColor3f(1, 0, 0);
    glutSolidSphere(0.1, 20, 20);
    glLightfv(GL_LIGHT0, GL_POSITION, @CLight);
    glTranslatef(0.9, 0, 0);
    glColor3f(0, 1, 0);
    glutSolidSphere(0.3, 20, 20);
  finally
    glPopMatrix;
  end;
  Win32Check(SwapBuffers(FDC));
end;

+ Инициализация
procedure TForm1.FormCreate(Sender: TObject);
var
  LFmt: TPixelFormatDescriptor;
  LIdx: Integer;
begin
  FDC := GetDC(Handle);
  FillChar(LFmt, SizeOf(LFmt), 0);
  LFmt.nSize := SizeOf(LFmt);
  LFmt.nVersion := 1;
  LFmt.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  LFmt.iPixelType := PFD_TYPE_RGBA;
  LFmt.cColorBits := 24;

  LIdx := Win32Check(ChoosePixelFormat(FDC, @LFmt));
  Win32Check(SetPixelFormat(FDC, LIdx, @LFmt));
  FGLCtx := Win32Check(wglCreateContext(FDC));
  Win32Check(wglMakeCurrent(FDC, FGLCtx));

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_COLOR_MATERIAL);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
end;


Чего я не добавил?

С уважением, Vasilisk

К сообщению приложен файл. Размер - 11Kb
24 сен 17, 10:50    [20818752]     Ответить | Цитировать Сообщить модератору
 Re: OpenGL просвечивание светом  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 9740
Нашел причину. Сфера резалась ближней плоскостью. Я переносил центр координат на 0.9, а потом рисовал сферу радиусом 0.3. Вот часть сферы и отсекалась. glFrustrum я с наскока не осилил, потому просто сделал перенос координат не на 0.9, а на 0.7 и все заработало.
4 окт 17, 15:28    [20842535]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить