Android Andengine为sprite中的每个像素设置alpha
我在场景中有一个大精灵-例如200x200,在应用程序中我有一个数组[200][200],我在大精灵中为每个像素存储0或1 我想在现有的雪碧上再画一个纹理雪碧(例如10x10),但我想计算新雪碧中的每个像素是否需要在这个场景中绘制取决于提供的阵列(如果阵列中新雪碧中像素的对应位置为“1”-我需要绘制这个像素,如果“0”-我不想绘制它(可能将alpha设置为0) 我想我可以为每个新精灵使用片段着色器,但我不知道如何为着色器提供数组数据来计算每个像素的颜色。 我认为也可以对整个场景使用片段着色器(如果渲染到纹理) 我是opengl新手,不知道用什么方式移动 当我为场景创建资源时-我尝试创建遮罩:Android Andengine为sprite中的每个像素设置alpha,android,opengl-es,andengine,fragment-shader,Android,Opengl Es,Andengine,Fragment Shader,我在场景中有一个大精灵-例如200x200,在应用程序中我有一个数组[200][200],我在大精灵中为每个像素存储0或1 我想在现有的雪碧上再画一个纹理雪碧(例如10x10),但我想计算新雪碧中的每个像素是否需要在这个场景中绘制取决于提供的阵列(如果阵列中新雪碧中像素的对应位置为“1”-我需要绘制这个像素,如果“0”-我不想绘制它(可能将alpha设置为0) 我想我可以为每个新精灵使用片段着色器,但我不知道如何为着色器提供数组数据来计算每个像素的颜色。 我认为也可以对整个场景使用片段着色器(如
mask = new float[512*512*4];
for (int i = 0; i < mask.length; i++)
{
mask[i] = 2f;
}
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 1, GLES20.GL_RGBA, 512, 512, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, FloatBuffer.wrap(mask));
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
但我在场景中看不到新项目(maskVal正在将数组作为与精灵尺寸相同的第二个纹理上载,然后在绘制精灵时,在同一texcoord处对第二个纹理进行采样 如果第二个纹理不符合遮罩条件,则丢弃片段
uniform sampler2d sprite;
uniform sampler2d mask;
in vec2 uv;
main() {
float maskVal = texture2D(mask, uv).r;
if(maskVal > 0.5) {
gl_FragColor = texture2D(sprite,uv);
} else {
discard;
}
}
谢谢-这是一个好主意,但我怎么知道-“如果”对于opengl来说是非常繁重的操作,我认为smth喜欢“步骤”在这种情况下是合适的。如果一切正常,我会尝试并标记为答案。@dilix如果你不想绘制像素,那么你必须使用
discard
语句,你必须将其放入if块中。我不能绘制它,但要使其透明吗?@dilix如果你说的是使用混合,那么你可以绘制一个0.0 alpha像素到屏幕,然后通过混合操作将其丢弃,但从片段着色器中丢弃它更有效。如果从frag着色器输出RGBA值而不丢弃它,则如果没有混合,它将被绘制到帧缓冲区,或者它将与目标混合,这是非常复杂的对于gpu来说,更多的工作不仅仅是丢弃。Tim,你可以检查另一个问题:
uniform sampler2d sprite;
uniform sampler2d mask;
in vec2 uv;
main() {
float maskVal = texture2D(mask, uv).r;
if(maskVal > 0.5) {
gl_FragColor = texture2D(sprite,uv);
} else {
discard;
}
}