Java 如何在纹理上绘制[Libgdx]
我有原始图像: 我如何才能在这幅图像上画画,而不是获得以下内容: PS:此代码无效:Java 如何在纹理上绘制[Libgdx],java,android,opengl-es,libgdx,Java,Android,Opengl Es,Libgdx,我有原始图像: 我如何才能在这幅图像上画画,而不是获得以下内容: PS:此代码无效: public void render() { Gdx.gl.glClearColor(1, 1, 1, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batcher.begin(); batcher.setColor(Color.BLUE); batcher.draw(texture, x, y, width, heig
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batcher.begin();
batcher.setColor(Color.BLUE);
batcher.draw(texture, x, y, width, height);
batcher.end();
}
可以使用具有以下逻辑的片段着色器:
if(alpha of the pixel is 1.0) then pixel=cyan
else pixel=white
这当然需要企鹅周围的空间是透明的(a=0)
完整有效代码:
String vertexShader = "attribute vec4 a_position;\n" +
"attribute vec4 a_color;\n" +
"attribute vec2 a_texCoord0;\n" +
"\n" +
"uniform mat4 u_projTrans;\n" +
"\n" +
"varying vec4 v_color;\n" +
"varying vec2 v_texCoords;\n" +
"\n" +
"void main() {\n" +
" v_color = a_color;\n" +
" v_texCoords = a_texCoord0;\n" +
" gl_Position = u_projTrans * a_position;\n" +
"}";
String fragmentShader = "#ifdef GL_ES\n" +
"precision mediump float;\n" +
"#endif\n" +
"\n" +
"varying vec4 v_color;\n" +
"varying vec2 v_texCoords;\n" +
"uniform sampler2D u_texture;\n" +
"uniform mat4 u_projTrans;\n" +
"\n" +
"void main() {\n" +
" vec4 color = v_color * texture2D( u_texture, v_texCoords );\n" +
" if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, 0.0 );\n" +
" else gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );" +
"}";
ShaderProgram shaderProgram = new ShaderProgram(vertexShader,fragmentShader);
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setShader(shaderProgram);
batch.draw(texture, x, y, width, height);
batch.end();
}
你到底想干什么?这段代码应该可以做到这一点。@Veljko,这段代码只需要着色。是的,那么您必须使用简单的片段着色器。这会覆盖纹理像素的颜色。不过链接图片中有一个很大的灰色阴影。如果alpha正好为1,则最好将颜色设置为青色,否则将其设置为(0,0,0)。(未检查链接图片中的alpha通道,因此不确定)。
String vertexShader = "attribute vec4 a_position;\n" +
"attribute vec4 a_color;\n" +
"attribute vec2 a_texCoord0;\n" +
"\n" +
"uniform mat4 u_projTrans;\n" +
"\n" +
"varying vec4 v_color;\n" +
"varying vec2 v_texCoords;\n" +
"\n" +
"void main() {\n" +
" v_color = a_color;\n" +
" v_texCoords = a_texCoord0;\n" +
" gl_Position = u_projTrans * a_position;\n" +
"}";
String fragmentShader = "#ifdef GL_ES\n" +
"precision mediump float;\n" +
"#endif\n" +
"\n" +
"varying vec4 v_color;\n" +
"varying vec2 v_texCoords;\n" +
"uniform sampler2D u_texture;\n" +
"uniform mat4 u_projTrans;\n" +
"\n" +
"void main() {\n" +
" vec4 color = v_color * texture2D( u_texture, v_texCoords );\n" +
" if( color.a == 0.0 ) gl_FragColor = vec4( color.r, color.g, color.b, 0.0 );\n" +
" else gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );" +
"}";
ShaderProgram shaderProgram = new ShaderProgram(vertexShader,fragmentShader);
public void render() {
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setShader(shaderProgram);
batch.draw(texture, x, y, width, height);
batch.end();
}