java - libgdx - 如何将 Sprite 批处理设置为像这样混合/着色?

标签 java android opengl-es libgdx

我目前有一个默认的 Sprite 批处理:

    batch = new SpriteBatch();

我读过有关使用着色器来修改批处理绘制每个 Sprite 的方式的信息。在我的游戏中,我尝试创建“夜间”效果 - 我希望屏幕上的每个像素都是黑色,除了已经是白色的像素。对于白色像素,我想要蓝色阴影。显然我是 libgdx 和 openGL 的新手 - 任何熟悉混合或着色器的人都可以帮助我解决这个问题吗?我应该对 spritebatch 做什么才能达到我描述的效果?

最佳答案

你想要达到的效果可以用这样的东西来实现。

顶点着色器

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoords;

void main()
{
    v_color = a_color;
    v_texCoords = a_texCoord0;
    gl_Position =  u_projTrans * a_position;
}

fragment 着色器

precision mediump float;

varying vec4 v_color;
varying vec2 v_texCoords;
uniform sampler2D u_texture;
uniform mat4 u_projTrans;

bool equals(float a, float b) {
    return abs(a-b) < 0.0001;
}

bool isWhiteShade(vec4 color) {
    return equals(color.r, color.g) && equals(color.r, color.b);
}

void main() {
    vec4 color = texture2D (u_texture, v_texCoords) * v_color;
    if(isWhiteShade(color)) {
        color *= vec4(0, 0, 1, 1);
    }
    else {
        color *= vec4(0, 0, 0, 1);
    }
    gl_FragColor = color;
}

将它们添加到 Assets 文件夹中,然后在创建 ShaderProgram 实例时作为参数传递,当然不要忘记将此着色器程序应用到您的 SpriteBatch。

关于java - libgdx - 如何将 Sprite 批处理设置为像这样混合/着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32363915/

相关文章:

java - 如何将 HTTP POST 请求从 Servlet 发送到外部 Web 服务?

java - Servlet 单元测试

android - Android Studio:UnsatisfiedLinkError:dlopen失败:/lib/arm/libuvcNative.so:具有文本重定位

android - 以编程方式查找外部 USB 存储设备路径?

iphone - 在 glDrawArrays() 上调试 SIGKILL。苹果手机

java - native JNI 文件无法在 Android Studio 中找到 Java 文件的路径

java - 过滤延迟初始化集合

java - 是否可以实现安全应用程序来阻止 Android 上漫游时的互联网?

java - OpenGL ES 2.0 2D-图像显示

opengl - 仅使用 EGLSurface 在多个表面上绘图?