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
如何在opengl中分离颜色和alpha混合函数?_Opengl_Directx_Alpha - Fatal编程技术网

如何在opengl中分离颜色和alpha混合函数?

如何在opengl中分离颜色和alpha混合函数?,opengl,directx,alpha,Opengl,Directx,Alpha,在尝试将我的2D阴影渲染技术从Directx移植到Opengl的过程中,我遇到了一个问题,似乎无法很好地访问Opengl blender 但首先,为了让以下内容有意义,我的算法: 我从后到前排序和渲染所有精灵,而不使用深度缓冲区。阴影精灵在投射它们的对象之前绘制,并使用下面的第二个blendstate,即gShadowBlendState。这使它们仅将其alpha值绘制到帧缓冲区上的alpha通道 常规对象的精灵使用下面第一个指定的gBlendState,这只是backbuffer的常规alph

在尝试将我的2D阴影渲染技术从Directx移植到Opengl的过程中,我遇到了一个问题,似乎无法很好地访问Opengl blender

但首先,为了让以下内容有意义,我的算法:

我从后到前排序和渲染所有精灵,而不使用深度缓冲区。阴影精灵在投射它们的对象之前绘制,并使用下面的第二个blendstate,即gShadowBlendState。这使它们仅将其alpha值绘制到帧缓冲区上的alpha通道

常规对象的精灵使用下面第一个指定的gBlendState,这只是backbuffer的常规alpha混合。但是,它们也会从backbuffer alpha通道中移除alpha,直到其不透明为止;这可以确保阴影不会通过它们前面的不透明对象显示

绘制的第三件事是全屏四元体,它使用阴影颜色和下面的最终混合状态进行渲染。它使用backbuffer的alpha通道进行不透明度处理,有效地显示了前面记录的所有阴影信息

本练习的全部目的是获得重叠处不会变暗的阴影

    gBlendState.SrcBlend       = D3DBLEND_SRCALPHA;
    gBlendState.BlendOp        = D3DBLENDOP_ADD;
    gBlendState.DestBlend      = D3DBLEND_INVSRCALPHA;
    gBlendState.SrcBlendAlpha  = D3DBLEND_ZERO;
    gBlendState.BlendOpAlpha   = D3DBLENDOP_ADD;
    gBlendState.DestBlendAlpha = D3DBLEND_INVSRCALPHA;

    gShadowBlendState.SrcBlend       = D3DBLEND_ZERO;
    gShadowBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowBlendState.DestBlend      = D3DBLEND_ONE;
    gShadowBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowBlendState.DestBlendAlpha = D3DBLEND_ONE;

    gShadowFillBlendState.SrcBlend       = D3DBLEND_DESTALPHA;
    gShadowFillBlendState.BlendOp        = D3DBLENDOP_ADD;
    gShadowFillBlendState.DestBlend      = D3DBLEND_INVDESTALPHA;
    gShadowFillBlendState.SrcBlendAlpha  = D3DBLEND_ONE;
    gShadowFillBlendState.BlendOpAlpha   = D3DBLENDOP_MAX;
    gShadowFillBlendState.DestBlendAlpha = D3DBLEND_ONE;
无论如何。我现在正试图在Opengl中实现这一点。目前,我已启用alpha混合

    glEnable(GL_BLEND);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

但我不知道如何给它单独的指示,如何计算颜色和阿尔法成分。所以我的问题是:在OpenGL中,有没有一种方法可以比glBlendFunc()更好地控制混合器?

我不确定您是否可以获得更好的控制,但您应该能够通过使用glColorMask首先渲染颜色通道,然后渲染alpha通道来实现大部分想要实现的功能。最后一步似乎应该保持不变。

我不确定您是否可以获得更精细的控制,但您应该能够通过使用glColorMask首先渲染颜色通道,然后渲染alpha通道来实现大部分想要做的事情。最后一步似乎应该保持不变。

我在这里留下了答案:


但有一个问题:用GL_u函数添加替换所有GL_uu添加。我的错误。

我在这里留下了答案:


但有一个问题:用GL_u函数添加替换所有GL_uu添加。我的错误。

谢谢Eric,这看起来确实是解决问题的另一种方法。我不太热衷于两次渲染几何体,但这是一种隔离alpha通道的方法,我没有考虑过。谢谢Eric,这看起来确实像是解决问题的另一种方法。我并不热衷于两次渲染我的几何体,但这是一种隔离alpha通道的方法,我没有考虑过。谢谢,Goz,这正是我想要的。除了基本的add外,你知道如何获得D3DBLENDOP_MAX操作吗?很抱歉,在美国工作时反应缓慢。。。不过,我认为你想要的扩展是谢谢,Goz,这是我想要的。除了基本的add外,你知道如何获得D3DBLENDOP_MAX操作吗?很抱歉,在美国工作时反应缓慢。。。然而,我认为你想要的扩展是