Плохой рендеринг в OpenGL Delphi - PullRequest
0 голосов
/ 09 января 2019

У меня проблема с рендерингом opengl.

with pfd do
begin
  nSize := SizeOf(PIXELFORMATDESCRIPTOR);
  nVersion := 1;
  dwFlags := PFD_DRAW_TO_WINDOW
          or PFD_SUPPORT_OPENGL
          or PFD_DOUBLEBUFFER;
  iPixelType := PFD_TYPE_RGBA;
  cColorBits := colorBits;
  cRedBits := 0;
  cRedShift := 0;
  cGreenBits := 0;
  cGreenShift := 0;
  cBlueBits := 0;
  cBlueShift := 0;
  cAlphaBits := 0;
  cAlphaShift := 0;
  cAccumBits := 0;
  cAccumRedBits := 0;
  cAccumGreenBits := 0;
  cAccumBlueBits := 0;
  cAccumAlphaBits := 0;
  cDepthBits := 16;
  cStencilBits := 0;
  cAuxBuffers := 0;
  iLayerType := PFD_MAIN_PLANE;
  bReserved := 0;
  dwLayerMask := 0;
  dwVisibleMask := 0;
  dwDamageMask := 0;
end;

glMaterialfv(GL_FRONT, GL_AMBIENT, @matAmbient);
glMaterialfv(GL_FRONT, GL_SPECULAR, @matSpecular);
glMaterialf(GL_FRONT, GL_SHININESS, 50.0);
glLightfv(GL_LIGHT0, GL_POSITION, @lightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @lmAmbient);

glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

Рендеринг OpenGl очень хорош, если угол между двумя гранями большой, и очень плох, если угол между 2 гранями мал, он выглядит серым:

enter image description here

Это мой полный код и двоичный файл: OpenglDelphiTest

Я хочу исчезнуть серым цветом. Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 09 января 2019

Проблема вызвана z-figthing .

Буфер глубины имеет ограниченную точность, которая зависит от битов буфера глубины (cDepthBits := 16;).
Если расстояние между ближней и дальней плоскостями проекции очень велико по сравнению с «z-диапазоном» (расстояние z от ближайшей точки геометрии до самой дальней точки) геометрии, то она может не следует различать различные положения z геометрии, поскольку они представлены одним и тем же значением в буфере глубины.

Это эффект, который вы можете видеть на изображении. Эффект возникает, когда геометрия находится близко друг к другу. Покрытая геометрия «сияет» сквозь геометрию спереди

Чтобы решить вашу проблему, вы должны увеличить расстояние до ближней плоскости или уменьшить расстояние до дальней плоскости в перспективной проекции и / или увеличить количество битов глубины (например, cDepthBits := 24;, cDepthBits := 32;).

...