首页 > 解决方案 > OpenGL Delphi 中的错误渲染

问题描述

我在渲染 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);

如果 2 个面之间的角度大,OpenGL 渲染非常好,如果 2 个面之间的角度小,则非常糟糕,它显示为灰色:

在此处输入图像描述

这是我的完整代码和二进制文件: OpenglDelphiTest

我想要消失的灰色。请帮我

标签: delphiopengldelphi-xe7depth-buffer

解决方案


该问题是由z-figthing引起的。

深度缓冲区的精度有限,这取决于深度缓冲区 ( cDepthBits := 16;) 的位。
如果投影的近平面和远平面之间的距离非常高,则与几何的“z-range”(从几何的最近点到最远点的z距离)相比,它可以' 不区分几何的不同 z 位置,因为它们在深度缓冲区中由相同的值表示。

这是您可以在图像中看到的效果。当几何体彼此靠近时会出现这种效果。被覆盖的几何图形通过前面的几何图形“闪耀”

为了解决您的问题,您必须增加到近平面的距离,分别减少透视投影到远平面的距离和/或增加深度位的数量(例如cDepthBits := 24;cDepthBits := 32;)。


推荐阅读