小编Arc*_* Pi的帖子

OpenGL - 对象轮廓

我正在尝试实现选择轮廓功能.这就是我现在所要做的.

在此输入图像描述

如您所见,当鼠标悬停并在所选对象周围绘制轮廓时,可以正确选择对象.

我现在想做的是以这种方式勾勒出对象的可见边缘

在此输入图像描述

左边的图像是我现在拥有的,右边的图像是我想要实现的.

这是我现在使用的程序.

void paintGL()
{
    /* ... */

    int w = geometry().width();
    int h = geometry().height();

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glStencilMask(0xFF);

    setClearColor(Qt::GlobalColor::darkGray);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    glStencilMask(0x00);
    DrawGeometry();

    if (HoveredSphere != RgbFromColorToString(Qt::GlobalColor::black))
    {
        glBindFramebuffer(GL_FRAMEBUFFER, addFBO(FBOIndex::OUTLINE));
        {
            glStencilFunc(GL_ALWAYS, 1, 0xFF);
            glStencilMask(0xFF);

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

            DrawOutline(HoveredSphere, 1.0f - 0.025f);
        }
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());

        glBindFramebuffer(GL_READ_FRAMEBUFFER, addFBO(FBOIndex::OUTLINE));
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFramebufferObject());
        {
            // copy stencil buffer
            GLbitfield mask = GL_STENCIL_BUFFER_BIT;
            glBlitFramebuffer(0, 0, w, h, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl graphics outlining highlight

7
推荐指数
1
解决办法
1122
查看次数

OpenGL impostor-sphere:计算深度值时出现问题

我正在尝试将球体渲染为冒名顶替者,但在计算球体表面点的深度值时遇到问题。

在这里,您可以看到当我围绕冒名顶替球体和与球体相交的“真实”立方体移动相机时会发生什么。

IMG

你可以看到,当我移动相机时,深度值不一致,立方体的某些部分应该在球体内部,取决于相机的位置,进出球体。

这些是 impostor-sphere 的顶点和片段着色器。

顶点着色器

#version 450 core

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

out vec2 coords;

void main()
{
    switch (gl_VertexID)
    {
    case 0:
        coords = vec2(-1.0f, -1.0f);
        break;
    case 1:
        coords = vec2(-1.0f, +1.0f);
        break;
    case 2:
        coords = vec2(+1.0f, -1.0f);
        break;
    case 3:
        coords = vec2(+1.0f, +1.0f);
        break;
    }

    // right & up axes camera space
    vec3 right = vec3(view[0][0], view[1][0], view[2][0]);
    vec3 up = vec3(view[0][1], view[1][1], view[2][1]);

    vec3 center = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d graphics depth-buffer

4
推荐指数
1
解决办法
933
查看次数

标签 统计

c++ ×2

graphics ×2

opengl ×2

3d ×1

depth-buffer ×1

highlight ×1

outlining ×1