OpenGL 中的错误渲染 Delphi
Bad rendering in 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);
如果两个面之间的角度很大,OpenGl 渲染非常好,如果两个面之间的角度很小,则渲染非常糟糕,它呈现灰色:
这是我的完整代码和二进制文件:
OpenglDelphiTest
我想要消失的灰色。请帮助我
问题是由z-figthing引起的。
深度缓冲区的精度有限,这取决于深度缓冲区的位数(cDepthBits := 16;
)。
如果投影的近平面和远平面之间的距离非常高,与几何的"z-range"(几何最近点到最远点的z距离)相比,那么它可以' 区分几何体的不同 z 位置,因为它们在深度缓冲区中由相同的值表示。
这是你在图片中看到的效果。当几何体彼此靠近时会发生这种效果。覆盖的几何体"shines"通过前面的几何体
要解决您的问题,您必须增加到近平面的距离,分别减少透视投影到远平面的距离 and/or 以增加深度位数(例如 cDepthBits := 24;
, cDepthBits := 32;
).
我在渲染 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 渲染非常好,如果两个面之间的角度很小,则渲染非常糟糕,它呈现灰色:
这是我的完整代码和二进制文件: OpenglDelphiTest
我想要消失的灰色。请帮助我
问题是由z-figthing引起的。
深度缓冲区的精度有限,这取决于深度缓冲区的位数(cDepthBits := 16;
)。
如果投影的近平面和远平面之间的距离非常高,与几何的"z-range"(几何最近点到最远点的z距离)相比,那么它可以' 区分几何体的不同 z 位置,因为它们在深度缓冲区中由相同的值表示。
这是你在图片中看到的效果。当几何体彼此靠近时会发生这种效果。覆盖的几何体"shines"通过前面的几何体
要解决您的问题,您必须增加到近平面的距离,分别减少透视投影到远平面的距离 and/or 以增加深度位数(例如 cDepthBits := 24;
, cDepthBits := 32;
).