我在场景中有一个大的精灵 - 例如200x200,在应用程序中我有一个数组[200] [200],其中我为大精灵中的每个像素存储0或1。
我想在现有的一个上面绘制一个纹理精灵(例如10x10),但我想计算新精灵中的eache像素,如果它需要在这个场景上绘制它取决于提供的数组(如果在相应的位置)数组中新精灵中的像素为'1' - 我需要绘制此像素,如果为'0' - 我不想绘制它(可能设置为alpha = 0)。
我想我可以为每个新的精灵使用片段着色器,但我无法理解如何向着色器提供数组数据来计算每个像素的颜色。 我认为也可以对整个场景使用片段着色器(如果渲染到纹理)。
我是opengl的新手,无法弄清楚要以什么方式移动。
当我为场景创建资源时 - 我尝试创建我的面具:
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);
然后当我在场景上绘制新项目时,我使用着色器:
setShaderProgram(ShaderProgram.getInstance());
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glUniform1i(RadialBlurExample.RadialBlurShaderProgram.sUniformMask, GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
但是我无法在场景中看到新项目(maskVal是&lt; 0.5)。
我尝试找到将数组作为纹理传递的工作方式,但我找不到它。
答案 0 :(得分:3)
将您的数组作为第二个纹理上传,其尺寸与精灵相同,然后在绘制精灵时,在同一个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;
}
}