标签:andengine opengl-es fragment-shader android
我在场景中有一个大Sprite-例如200×200,在应用程序中,我有一个array [200] [200],其中我为大Sprite中的每个像素存储0或1.
我想在现有精灵上再绘制一个纹理精灵(例如10×10),但是我想为新精灵中的每个像素计算是否需要在此场景上绘制取决于所提供的数组(如果位于像素的相应位置)数组中的新精灵为’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为< 0.5). 我试图找到一种将数组作为纹理传递的工作方式,但是我找不到它.
解决方法:
将数组上传为具有与精灵相同尺寸的第二个纹理,然后在绘制精灵时,在同一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;
}
}
标签:andengine,opengl-es,fragment-shader,android 来源: https://codeday.me/bug/20191127/2077045.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。