我需要以分层方式将一些纹理叠加到视频上(即第一个纹理应该出现在第二个纹理下面,当它们都是半透明等时)。 纹理都具有不同的Z值,因此应该没有冲突。图像说千言万语,所以我在下面附上了一个:
如您所见,箭头是半透明的,彼此交叉。然而,只有蓝色和红色箭头似乎相互作用。为了论证,让我们说红色箭头的值为z(在这种情况下为垂直)值为4,蓝色为6,白色为10。
我正在使用的混合功能是:
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
并启用GL_DEPTH_TEST
。
我正在寻找所有重叠的纹理与红色和蓝色相互作用。即,您可以看到白色箭头下方的红色箭头,并且可以看到较暗的红色箭头交叉的较暗的红色箭头。有人能指出我正确的方向吗?
编辑:下面是用于为每个帧渲染设置openGL的代码。
public void display(final GL gl, final GLProjection projection, final FieldMask fieldMask)
{
layerTextureShader.updateShader(gl, projection, fieldMask);
if (useMask)
{
layerMaskShader.updateShader(gl, projection, fieldMask);
}
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getVertexBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 3 * 4, getVertices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 2 * 4, getTexCoords(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, getIndicesBufferObject());
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, getNoOfIndices() * 4, getIndices(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getColorBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getColors(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
if (useMask)
{
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getMaskColorBufferObject());
gl.glBufferData(GL.GL_ARRAY_BUFFER, getNoOfVertices() * 4 * 4, getMaskColors(), GL.GL_STREAM_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glActiveTexture(GL.GL_TEXTURE0);
gl.glBindTexture(GL.GL_TEXTURE_2D, textureId);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
if (useMask)
{
gl.glBlendEquation(GL.GL_MIN);
layerMaskShader.use(gl);
display(gl, true);
layerMaskShader.release(gl);
}
gl.glBlendEquation(GL.GL_MAX);
layerTextureShader.use(gl);
display(gl, false);
layerTextureShader.release(gl);
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDepthMask(true);
gl.glDisable(GL.GL_BLEND);
}
答案 0 :(得分:2)
对于Alpha混合,您需要确保以正确的顺序绘制它们或使用添加剂混合绘制它们。
执行此操作的常用方法是将Alpha混合项目与非Alpha混合项目分开。渲染所有标准项目,从后到前对alpha混合的项目进行排序,并按顺序渲染它们。如果帧速率是一个问题(比如你有很多要排序的项目),你可以对多个帧进行排序。