当前位置: 首页 > 知识库问答 >
问题:

OpenGL Ubuntu深度

龙俊德
2023-03-14

我正在Ubuntu上编写一个简单的OpenGL程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST似乎不起作用。后面的对象显示在前面的对象的前面。深度缓冲区由启用

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

GL_DEPTH_TEST由

glEnable(GL_DEPTH_TEST);

并且深度缓冲区在绘制之前被清除

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

完整的代码如下所示:

#define BUFFER_OFFSET( offset )   ((GLvoid*) (offset))

#define NUM_VERTICES 8

vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0},    // front
 {0.0, 0.5, -0.25, 1.0},
 {0.5, 0.5, -0.25, 1.0},
 {0.5, 0.0, -0.25, 1.0}, 
 {0.25, 0.25, -0.75, 1.0},  // back
 {0.25, 0.75, -0.75, 1.0},
 {0.75, 0.75, -0.75, 1.0},
 {0.75, 0.25, -0.75, 1.0}};

vec4 vertex_colors[8] =
{{1.0, 0.0, 0.0, 1.0},  // red
 {1.0, 0.0, 0.0, 1.0},
 {1.0, 0.0, 0.0, 1.0},
 {1.0, 0.0, 0.0, 1.0},
 {0.0, 1.0, 0.0, 1.0},  // green
 {0.0, 1.0, 0.0, 1.0},
 {0.0, 1.0, 0.0, 1.0},
 {0.0, 1.0, 0.0, 1.0}};

void init(void)
{
    GLuint program = initShader("vshader_td.glsl", "fshader_td.glsl");
    glUseProgram(program);

    GLuint vao;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    GLuint buffer;
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertex_colors), vertex_colors);

    GLuint vPosition = glGetAttribLocation(program, "vPosition");
    glEnableVertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

    GLuint vColor = glGetAttribLocation(program, "vColor");
    glEnableVertexAttribArray(vColor);
    glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points)));

    glEnable(GL_DEPTH_TEST);
    glClearColor(1.0, 1.0, 1.0, 1.0);
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawArrays(GL_QUADS, 0, NUM_VERTICES);
    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(512, 512);
    glutCreateWindow("Test Depth");
    glewInit();
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

顶点着色器如下所示:#version 130

in vec4 vPosition;
in vec4 vColor;
out vec4 color;

void main()
{
    color = vColor;
    gl_Position = vPosition;
}

片段着色器如下所示:#version 130

in vec4 color;
out vec4 fColor;

void main()
{
    fColor = color;
}

为什么前面的物体会被后面的物体挡住?

共有1个答案

冯通
2023-03-14

在顶点着色器中,你可以

in vec4 vPosition;
[....]
gl_Position = vPosition;

而不应用任何变换。由于<code>gl_Position<code>是顶点的剪辑空间位置,这意味着顶点坐标被解释为在剪辑空间中指定。

和您的顶点坐标

vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0},    // front
 [...]
 {0.25, 0.25, -0.75, 1.0},  // back

只是暗示你标记为“前面”的点在你标记为“后面”的点后面。

我不知道你是如何得出相反的假设的,我只能猜测,你把这与经典的左手OpenGL眼空间约定混淆了,其中“摄像机:观察-z方向-但这在这里完全不相关,因为你根本没有建立眼空间,直接在剪辑空间中绘制。

 类似资料:
  • 主要内容 课程列表 专项课程学习 辅助课程 论文专区 课程列表 课程 机构 参考书 Notes等其他资料 卷积神经网络视觉识别 Stanford 暂无 链接 神经网络 Tweet 暂无 链接 深度学习用于自然语言处理 Stanford 暂无 链接 自然语言处理 Speech and Language Processing 链接 专项课程学习 下述的课程都是公认的最好的在线学习资料,侧重点不同,但推

  • 本章将介绍如何使用接口在网站上进行对接 在网站<head></head>或<body></body>区域引入小能 js <script id="xiaonengjs" src="//visitor.ntalker.com/visitor/js/xiaoneng.js?siteid=您的网站id"></script> 如果您需要更新用户信息,如身份信息,您可以添加以下代码xn('setCustom

  • 浏览深度分为两部分: 时间/设备筛选 和 浏览深度分析 (详情) 1.时间筛选 便捷按钮有今日、昨日、前日、上周 X、近七天,并且能自定义选择时间段/设备来得出想要的结果报表 2.浏览深度分析 (详情) 1)访问者浏览深度情况,体现网站内容是否足够吸引 2)如有需要,亦可点击下载当前报表及更多数据下载,将报表下载到个人电脑,以供存档及分析

  • 在坐标系统小节中,我们渲染了一个3D箱子,并且运用了深度缓冲(Depth Buffer)来防止被阻挡的面渲染到其它面的前面。在这一节中,我们将会更加深入地讨论这些储存在深度缓冲(或z缓冲(z-buffer))中的深度值(Depth Value),以及它们是如何确定一个片段是处于其它片段后方的。 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了

  • Google Cloud Platform 推出了一个 Learn TensorFlow and deep learning, without a Ph.D. 的教程,介绍了如何基于 Tensorflow 实现 CNN 和 RNN,链接在 这里。 Youtube Slide1 Slide2 Sample Code

  • 简介 深度截图(英文名:Deepin Screenshot)是deepin团队开发的一款精巧截图软件。 在Linux下虽然已有Shutter、 Scrot等强大的截图工具,但是它们操作体验并不是太好。因此深度截图学习了QQ截图的优点,实现了截图、编辑、分享一体化操作,方便用户降低学习成本,享受截图的快乐。 深度截图是一款自由软件,遵循自由软件基金会发布的 GNU 通用公共许可证第三版。 目前最新版