opengl Raylib alpha混合无法正常工作?[已关闭]

iibxawm4  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
24天前关闭
Improve this question
我正在使用ralib(使用OpenGL)制作一个2D游戏。我有menubutton对象的精灵,我想在按钮上画一个白色的“面具”精灵,但给予它一个透明度。(只有面具将有一个透明度。)这将产生一个hilighted按钮。
但我得到的却是:

退出按钮实际上变暗了,这永远不应该发生。如果你在其他任何东西上合成一个完美的白色精灵,它应该变得更亮(除非alpha正好是0,在这种情况下,原始精灵不会改变/与任何东西混合)。
MenuBut.hpp中的一些代码:

int hi; // timer for highlight
const int hi_max = 20;
const float hi_alph = 0.333f;

MenuBut.cpp中的绘图代码

// this draws the regular MenuButton graphic
DrawTexturePro(GCN::TG->tex_grid_menubuts, (Rectangle){0, 32.0f*t, 320, 32}, (Rectangle){(float)x, (float)y, (float)320, (float)32}, (Vector2){0, 0}, 0.0f, (Color){255, 255, 255, 255);

if (hi > 0)
{
    BeginBlendMode(BLEND_ALPHA);
    // this draws a white mask sprite over the actual MenuButton graphic
    DrawTexturePro(GCN::TG->tex_grid_menubuts, (Rectangle){320, 32.0f*t, 320, 32}, (Rectangle){(float)x, (float)y, (float)320, (float)32}, (Vector2){0, 0}, 0.0f, (Color){255, 255, 255, (unsigned char)round( 1.0f*(hi_alph*hi/hi_max)*255 )});
    EndBlendMode();
}

// draw text for "Exit"
DrawTextEx(GCN::TG->fnt_AL, disp_text.c_str(), (Vector2){(float)(x + w/2 - MeasureTextEx(GCN::TG->fnt_AL, disp_text.c_str(), 24.0f, 1.0f).x/2), (float)(y+6)}, 24.0f, 1.0f, (Color){0, 0, 0, 255});

请注意,如果我将hi_alph更改为更高的值,如0.750f,它确实会显得更亮,但过渡非常奇怪,就像它开始变得更暗,然后突然激增到更白。这个转变对眼睛来说有点痛。
我很确定是rgb值的混合不正确,因为按钮在这两种情况下都变得太快了。
我已经尝试了所有其他可用的混合模式(除了自定义):BLEND_ADDITIVE、BLEND_MULTIPLE、BLEND_ADD_COLORS、BLEND_SUBTRACT_COLORS、BLEND_ALPHA_PREMULTIPLE。其中一些产生了相同的结果,另一些产生了更奇怪的结果,这不是我想要的。
我一直在寻找阿尔法问题,并找到了一些职位。This SO topic是迄今为止解释预乘alpha如何工作的最有帮助的,我想我理解它。Another谈到alpha的麻烦,虽然它是深入到OpenGL,我不明白。
其实我不懂OpenGL。我真的希望在raylib中有一个解决方案,而不必编写自己的着色器。

qqrboqgw

qqrboqgw1#

我想通了。首先,你必须使用#include“rlgl.h”来访问rlSetBlendFactorsSeparate函数,然后ofc开始使用混合模式BLEND_CUSTOM_SEPARATE。
然而,真实的关键是开始搜索OpenGL如何使用alpha混合。不是瑞立帮Raylib只有很少的官方文档,它只是一个PDF备忘单和FAQ。真实的文档是源代码本身及其注解,但除非您也了解OpenGL及其功能,否则您无法理解它。
无论如何,解决方案是

rlSetBlendFactorsSeparate(0x0302, 0x0303, 1, 0x0303, 0x8006, 0x8006);
BeginBlendMode(BLEND_CUSTOM_SEPARATE);
// do the draw here
EndBlendMode();

我甚至从a help threada related thread中获取了这些值,但这些特殊值存在于rlgl. h中的查找表中,因此您可以确切地了解它们是什么。
(BTW,显然这种混合问题只存在于绘制到不同的渲染目标时(绘制到纹理而不是屏幕)。)

相关问题