首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么GL_RASTERIZER_DISCARD不允许我写模板缓冲区?

为什么GL_RASTERIZER_DISCARD不允许我写模板缓冲区?
EN

Stack Overflow用户
提问于 2020-05-14 12:56:32
回答 1查看 227关注 0票数 1

我想在3次传递中用模板缓冲区绘制轮廓。

  1. 正常拉深道次
  2. 轮廓掩模生成孔型
  3. 轮廓图孔型

第二遍不需要片段着色器来工作,因为它只写到模板缓冲区,所以我使用glEnable(GL_RASTERIZER_DISCARD);来防止接触片段着色器。

问题是掩码没有被生成(这是我的想法,也许是其他的东西),因此轮廓四段不会被丢弃。它是画的,但在上面的四边形,我想要被概述。如果这有意义的话。

代码语言:javascript
复制
int main()
{
    //create window, gl context etc. etc...

    Shader colorShader("colorShader.glsl");
    Shader maskShader("maskShader.glsl");

    //Creates geometry for quad, also creates vertex array, vertex buffer and adds data glBufferData.
    //this code is tested and works, so it is not neccessery to show what it does internaly.
    Quad sceneQuad(colorShader);
    Quad maskQuad(maskShader);
    Quad outlineQuad(colorShader);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

    bool quit = false;

    while(!quit) {
        glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glDisable(GL_RASTERIZER_DISCARD);
        glStencilMask(0x00);

        //binds everything, and call glDraw*, its parameter is model matrix and u_r uniform
        //it is also tested and works fine
        sceneQuad->Draw(Scale(1.0f), 1.0f);

        glEnable(GL_RASTERIZER_DISCARD);

        glStencilFunc(GL_ALWAYS, 1, 0xFF);
        glStencilMask(0xFF);
        maskQuad->Draw(); // it does not need matrix or u_r, because it uses different shader

        glDisable(GL_RASTERIZER_DISCARD);

        glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
        glStencilMask(0x00);
        glDisable(GL_DEPTH_TEST);

        oulineQuad->Draw(Scale(1.1), 0.0f); //a bit scaled 
    }
}

彩色着色器:

代码语言:javascript
复制
#version 460 core

layout (location = 0) in vec2 a_position;

uniform mat4 u_model;

void main()
{
    gl_Position = u_model * vec4(a_position, 0.0f, 1.0f);
}

//-------------------------------------------------------------------

#version 460 core

layout (location = 0) out vec4 f_color;

uniform float u_r;

void main()
{        
    f_color = vec4(u_r, 0.0f, 1.0f, 1.0f);
}

掩码着色器,只是顶点程序:

代码语言:javascript
复制
#version 460 core

layout (location = 0) in vec2 a_position;

void main()
{
    gl_Position = vec4(a_position, 0.0f, 1.0f);
}

我期望的是画紫色的四角体,然后再画一次,但没有碎片着色器,只绘制到模板缓冲区,然后在所有的顶部绘制蓝色四角体,但丢弃模板缓冲区中的掩码绘制的像素。

它所做的,是在不丢弃掩码像素的情况下绘制蓝色四角体。

怎么修呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-14 13:10:06

来自弃置“

启用后,原语将在栅格化阶段之前立即丢弃,但在可选转换反馈阶段之后丢弃(见第13.2节)

如果您想要绘制到模具缓冲区,您仍然需要光栅化,而不是颜色缓冲区。

为此,您可以使用

代码语言:javascript
复制
glDrawBuffer(GL_NONE)

代码语言:javascript
复制
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE)

请参阅这个职位进行比较,但我认为这两种方法对您的应用程序都很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61797944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档