gpt4 book ai didi

android - OpenglES 2.0 PNG alpha 纹理重叠

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:10 27 4
gpt4 key购买 nike

我试图在屏幕上绘制多个具有 alpha channel 的六边形。图片是这样的:

http://img834.imageshack.us/img834/571/hexagon.png

所以,我将纹理加载到程序中,没关系。当它运行时,alpha channel 会与背景颜色混合,这没问题,但是当两个六边形自身重叠时,重叠部分会变成背景颜色!图片下方:

http://img259.imageshack.us/img259/213/20120731163847.png

当然,这不是我期望的效果。我希望它们重叠,而不是将此背景绘制在其他纹理上。这是我的绘图代码:

    GLES20.glUseProgram(Program);

hVertex = GLES20.glGetAttribLocation(Program,"vPosition");
hColor = GLES20.glGetUniformLocation(Program, "vColor");
uTexture = GLES20.glGetUniformLocation(Program, "u_Texture");
hTexture = GLES20.glGetAttribLocation(Program, "a_TexCoordinate");
hMatrix = GLES20.glGetUniformLocation(Program, "uMVPMatrix");

GLES20.glVertexAttribPointer(hVertex, 3, GLES20.GL_FLOAT, false, 0, bVertex);
GLES20.glEnableVertexAttribArray(hVertex);
GLES20.glUniform4fv(hColor, 1, Color, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, hTexture);
GLES20.glUniform1i(uTexture, 0);
GLES20.glVertexAttribPointer(hTexture, 2, GLES20.GL_FLOAT, false, 0, bTexture);
GLES20.glEnableVertexAttribArray(hTexture);

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
GLES20.glEnable(GLES20.GL_BLEND);

x=-1;y=0;z=0;
for (int i=0;i<10;i++) {
Matrix.setIdentityM(ModelMatrix, 0);
Matrix.translateM(ModelMatrix, 0, x, y, z);
x+=0.6f;
Matrix.multiplyMM(ModelMatrix, 0, ModelMatrix, 0, ProjectionMatrix, 0);
GLES20.glUniformMatrix4fv(hMatrix, 1, false, ModelMatrix, 0);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, DrawOrder.length, GLES20.GL_UNSIGNED_SHORT, bDrawOrder);
}

GLES20.glDisable(GLES20.GL_BLEND);
GLES20.glDisableVertexAttribArray(hVertex);
}

还有我的 fragment 着色器:

public final String fragmentShaderCode =
"precision mediump float;" +
"uniform vec4 vColor;" +
"uniform sampler2D u_Texture;" +
"varying vec2 v_TexCoordinate;" +
"void main() {" +
" gl_FragColor = vColor * texture2D(u_Texture, v_TexCoordinate);" +
"}";

和我的渲染器代码:

    super(context);
setEGLContextClientVersion(2);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setEGLConfigChooser(8, 8, 8, 8, 8, 8);
renderer = new GLRenderer(context);
setRenderer(renderer);

我已经尝试在 glBlendFunc 上使用不同的函数,但似乎没有任何效果。有人知道问题出在哪里吗?我真的迷路了..如果需要代码就问!

谢谢!

最佳答案

我的猜测是您需要在绘制这些时禁用深度测试。由于它们都出现在相同的深度,当您绘制最左边的环时,它会为四边形中的每个像素写入深度缓冲区,即使是透明的。

然后,当您向右绘制下一个四边形时,不会绘制重叠的像素,因为它们未通过深度测试,因此您只会得到一个与第一个四边形相交的空白区域。

关于android - OpenglES 2.0 PNG alpha 纹理重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11748176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com