繁体   English   中英

使用深度缓冲区和深度测试初始化 OpenGL

[英]Initializing OpenGL with depth buffer and depth testing

我想在不使用 GLUT 的情况下以独立于平台的方式使用深度缓冲区初始化 OpenGL。

如何使用 c# 包装器移除 OpenGL 场景中的隐藏表面。 我没有使用 GLUT,所以我不能使用 glutInitDisplayMode。 任何的想法?


更多细节:

我发现了这些关于隐藏表面去除的步骤:

  1. 通过 glutInitDisplayMode 请求 z-buffer:

     // GLUT_DEPTH to request for depth-buffer glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  2. 启用 z-buffer 进行深度测试:

     glEnable(GL_DEPTH_TEST);
  3. 当我们清除颜色缓冲区时清除 z 缓冲区:

     // Clear color and depth buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

据我所知,glutInitDisplayMode 是 GLUT 函数之一。 我可以在没有不良影响的情况下消除这个电话吗? 如果不是,那么可以解决问题的替代纯 opengl 调用是什么。

我正在使用由(Colin P. Fahey)编写的 c# 包装器

GLUT不是OpenGL!

无论GLUT做什么,你的C#包装器也可能提供它,也许更好。 您需要的是深度缓冲和启用深度测试


更新反映问题编辑

获取深度缓冲区的确切步骤完全取决于您使用的包装器。 因此,告诉我们哪个包装器是必不可少的。

OpenGL是一个平台无关的渲染API。 为窗口系统创建OpenGL上下文是窗口系统接口(例如, WGL )的工作。

根据您正在使用的C#绑定,您可能有直接的wgl或glx调用或类似GLUT的平台窗口调用(在OpenTK的情况下就像这样)。 如果您告诉我们您使用的绑定,我可以提供更多信息。

您是否考虑过使用不那么奇怪的界面?古怪的? 我都是为了寻找随机人写的不同而有趣的工具,但这些文档非常糟糕。

我查看了它,看来它的InitializeOpenGL命令不允许你为GL初始化设置任何参数。 完全没有。 这意味着你几乎受控制的支配。

现在,默认情况下它可能会给你一个深度缓冲区(坦率地说,如果没有,那么它就完全没用了,你应该立即放弃它,如果不是更快的话)。 但由于没有办法告诉它你想用缓冲区做什么,所以你无法做到确保它。

就个人而言,我建议你放弃这个工具,使用像OpenTK这样的主流。 当然,OpenTK的稳定发布是相当古老的,但它仍然比你现在使用的更好。

这是激活深度缓冲区和启用深度测试的一系列 OpenGL 调用(在 C 中):

GLuint depth_buffer;
// Generate an id for the buffer object
glGenRenderbuffers(1, &depth_buffer);
// Bind the object to the OpenGL context
glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
// Allocate storage
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, width, height);
// Attach the depth buffer to the frame buffer
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
                          GL_RENDERBUFFER, depth_buffer);
// Enable OpenGL depth test
glEnable(GL_DEPTH_TEST);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM