如何在opengl中分离颜色和alpha混合函数?
在尝试将我的2D阴影渲染技术从Directx移植到Opengl的过程中,我遇到了一个问题,似乎无法很好地访问Opengl blender 但首先,为了让以下内容有意义,我的算法: 我从后到前排序和渲染所有精灵,而不使用深度缓冲区。阴影精灵在投射它们的对象之前绘制,并使用下面的第二个blendstate,即gShadowBlendState。这使它们仅将其alpha值绘制到帧缓冲区上的alpha通道 常规对象的精灵使用下面第一个指定的gBlendState,这只是backbuffer的常规alpha混合。但是,它们也会从backbuffer alpha通道中移除alpha,直到其不透明为止;这可以确保阴影不会通过它们前面的不透明对象显示 绘制的第三件事是全屏四元体,它使用阴影颜色和下面的最终混合状态进行渲染。它使用backbuffer的alpha通道进行不透明度处理,有效地显示了前面记录的所有阴影信息 本练习的全部目的是获得重叠处不会变暗的阴影如何在opengl中分离颜色和alpha混合函数?,opengl,directx,alpha,Opengl,Directx,Alpha,在尝试将我的2D阴影渲染技术从Directx移植到Opengl的过程中,我遇到了一个问题,似乎无法很好地访问Opengl blender 但首先,为了让以下内容有意义,我的算法: 我从后到前排序和渲染所有精灵,而不使用深度缓冲区。阴影精灵在投射它们的对象之前绘制,并使用下面的第二个blendstate,即gShadowBlendState。这使它们仅将其alpha值绘制到帧缓冲区上的alpha通道 常规对象的精灵使用下面第一个指定的gBlendState,这只是backbuffer的常规alph
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操作吗?很抱歉,在美国工作时反应缓慢。。。然而,我认为你想要的扩展是