Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL淡入淡出问题_C++_Opengl_Fade - Fatal编程技术网

C++ OpenGL淡入淡出问题

C++ OpenGL淡入淡出问题,c++,opengl,fade,C++,Opengl,Fade,这就是我正在做的: 使用以下颜色渲染第一幅图像:glColor4f(1.0,1.0,1.0,1.0) 使用以下颜色渲染第二个图像:glColor4f(1.0、1.0、1.0、calc)calc是一个在一秒钟内从0.0变为1.0的数字,我可以验证它是否真的做到了这一点 我希望它能做的是从一个图像淡入另一个图像,它能做到这一点,但中途,它会变成某种灰色(顺便说一句,黑色是背景色)。您可以在此处看到问题: P>我只想要基本淡色, >没有>强>淡色时(在0.5透明度下最强)。我试过用GIMP来做这

这就是我正在做的:

  • 使用以下颜色渲染第一幅图像:
    glColor4f(1.0,1.0,1.0,1.0)
  • 使用以下颜色渲染第二个图像:
    glColor4f(1.0、1.0、1.0、calc)
    calc
    是一个在一秒钟内从0.0变为1.0的数字,我可以验证它是否真的做到了这一点
我希望它能做的是从一个图像淡入另一个图像,它能做到这一点,但中途,它会变成某种灰色(顺便说一句,黑色是背景色)。您可以在此处看到问题:

<> P>我只想要基本淡色,<强> >没有>强>淡色时(在0.5透明度下最强)。我试过用GIMP来做这件事,底层是不透明的,顶层是可变不透明的,它工作得很好,它完全符合我的要求,我只是不知道为什么我的代码(或OpenGL)不会这样做。演示我的意思的视频:

编辑:经过一点实验(将背景颜色更改为红色)后,在0.5时,它将变为半透明,这通常是所需的效果,但两种纹理都是半透明的(不仅仅是顶部的纹理)。为什么会发生这种情况

代码如下:

void Sprite::render_single(Image* image, Pos2D pos, Angle angle) {
        int cx = image->width / 2;
        int cy = image->height / 2;
        glPushMatrix();
        glTranslatef(pos.x + cx, pos.y + cy, 0);
        glRotatef(angle.to_degrees(), 0.0, 0.0, 1.0);
        glTranslatef(-cx, -cy, 0);
        image->bind();
        glBegin(GL_QUADS);
                glTexCoord2f(0.0, 0.0);
                glVertex2f(0.0, 0.0);
                glTexCoord2f(1.0, 0.0);
                glVertex2f(image->width, 0.0);
                glTexCoord2f(1.0, 1.0);
                glVertex2f(image->width, image->height);
                glTexCoord2f(0.0, 1.0);
                glVertex2f(0.0, image->height);
        glEnd();
        image->unbind();
        glPopMatrix();
}

void Sprite::render(Pos2D pos, Angle angle) {
        Image* img = this->get_current_frame();
        if (this->images.size() == 1) {
                this->render_single(img, pos, angle);
                return;
        }
        double calc = (((double)this->current_frame_overflow) / this->frame_length);
        std::cout << calc << std::endl;
        glPushMatrix();
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        this->render_single(img, pos, angle);
        img = this->get_next_frame();
        glColor4f(1.0f, 1.0f, 1.0f, calc);
        this->render_single(img, pos, angle);
        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        glPopMatrix();
}

此外,这里是主循环的全部源代码(其中包含大部分OpenGL内容):。雪碧:。

灰色边缘是不使用预乘alpha的副作用


尝试使用
glBlendFunc(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)以启用预乘alpha。查看预乘了解更多信息,但基本上所有纹理和颜色都需要预乘。简而言之,你通过每个像素和颜色,把r,g和b乘以a。因此,如果您将50%的白色设置为(1,1,1,0.5),那么现在将变成(0.5,0.5,0.5,0.5)。在这种情况下,目标颜色也需要是(calc,calc,calc,calc)。

灰色条纹是不使用预乘alpha的副作用


尝试使用
glBlendFunc(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)以启用预乘alpha。查看预乘了解更多信息,但基本上所有纹理和颜色都需要预乘。简而言之,你通过每个像素和颜色,把r,g和b乘以a。因此,如果您将50%的白色设置为(1,1,1,0.5),那么现在将变成(0.5,0.5,0.5,0.5)。在这种情况下,目标颜色也需要是(calc、calc、calc、calc)。

使用
glBlendFunc
功能(启用混合)时,使用相同的因子计算目标片段的alpha值

这仅在渲染到具有alpha通道的纹理并随后在启用混合的情况下使用该纹理时才起作用。在这种情况下,渲染纹理的alpha通道最终的值介于0和1之间。当纹理被绘制到后缓冲区时,这会导致一些背景溢出


解决方案只是在绘制全屏四元体时禁用混合。此外,如果不使用通道,也可以将其从纹理中移除(对于内部纹理格式,使用
GL\u RGB
而不是
GL\u RGBA

当使用
glBlendFunc
函数(启用混合)时,使用相同的因子计算目标片段的alpha值

这仅在渲染到具有alpha通道的纹理并随后在启用混合的情况下使用该纹理时才起作用。在这种情况下,渲染纹理的alpha通道最终的值介于0和1之间。当纹理被绘制到后缓冲区时,这会导致一些背景溢出


解决方案只是在绘制全屏四元体时禁用混合。此外,如果不使用通道,您也可以将其从纹理中移除(对于内部纹理格式,请使用
GL\u RGB
而不是
GL\u RGBA

视频有帮助,但我们不知道您实际在做什么。看起来怎么样?@Trax,谢谢,我知道有些东西我忘了。。。我在帖子中加了它:)你试过混合(一,一减去SRCα)吗?这是图像编辑器在默认情况下所做的,即“求和”两层(背景是不透明的+顶部半透明的)。@Trax,是的,但它开始看起来非常奇怪(整个游戏都是这样,虽然我没有这个问题,但它似乎是分层或其他什么……非常奇怪)。。。使用
GL_SRC_ALPHA
代替
GL_ONE
效果很好,但我的问题仍然是我的问题,我刚刚醒来,它是(GL_SRC_ALPHA,GL_ONE),但是使用它之后,你应该回到以前的设置,否则,此混合功能将用于所有对象。它们有助于视频,但我们不知道您实际想做什么。看起来怎么样?@Trax,谢谢,我知道有些东西我忘了。。。我在帖子中加了它:)你试过混合(一,一减去SRCα)吗?这是图像编辑器在默认情况下所做的,即“求和”两层(背景是不透明的+顶部半透明的)。@Trax,是的,但它开始看起来非常奇怪(整个游戏都是这样,虽然我没有这个问题,但它似乎是分层或其他什么……非常奇怪)。。。使用
GL_SRC_ALPHA
而不是
GL_ONE
效果很好,但是我的问题仍然是我的问题,我刚醒来,它是(GL_SRC_ALPHA,GL_ONE),但是在使用它之后,你应该回到你以前的设置,否则这个混合函数会在你所有的对象中使用。我尝试了这个,但是发生了不同的效果。首先,纹理变得异常明亮,最后,它最终变为正常亮度。我试着使用函数之前的调用,在中间(在渲染第一个函数之后),另一个问题是:(0.5,0.5,0.5,0.5)不会比(1,1,1,0.5)更透明吗?还是我不理解你
/**
 * @brief Initializes OpenGL
 */
void Game::init_gl() {
        float width = this->display->w;
        float height = this->display->h;
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0.0, width, height, 0.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glDisable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}