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)代码>
是一个在一秒钟内从0.0变为1.0的数字,我可以验证它是否真的做到了这一点calc
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);
}