あなたの流れは次のように行く必要がありますので、これは、後処理シェーダです:
はSpriteBatchのデフォルトのシェーダを使用してピクセル完璧な解像度でFBOに、あなたのシーンを描画します。
アップスケールシェーダを使用して、FBOのテクスチャを画面のフレームバッファに描画します。 SpriteBatchが使用する属性とユニフォームに一致するようにシェーダを変更すると、これを行うことができます。 (あなたは、代わりシェーダが期待した属性名を持つシンプルなメッシュを作成することもできますが、SpriteBatchは、おそらく最も簡単です。)すべての
まず、我々は、SpriteBatchで、典型的なシェーダを使用していないあなたがShaderProgram.pedantic = false;
を呼び出す必要がありますので、どこかに何かをロードする前に。
ここで、適切なサイズのFrameBufferが必要です。スプライトがピクセルで完全になるようにサイズ調整する必要があります(テクスチャの1ピクセルは世界の1ピクセルにスケールされます)。このようなもの:
public void resize (int width, int height){
float ratio = (float)width/(float) height;
int gameWidth = (int)(GAME_HEIGHT/ratio);
boolean needNewFrameBuffer = false;
if (frameBuffer != null && (frameBuffer.getWidth() != gameWidth || frameBuffer.getHeight() != GAME_HEIGHT)){
frameBuffer.dispose();
needNewFrameBuffer = true;
}
if (frameBuffer == null || needNewFrameBuffer)
frameBuffer = new FrameBuffer(Format.RGBA8888, gameWidth, GAME_HEIGHT);
camera.viewportWidth = gameWidth;
camera.viewportHeight = GAME_HEIGHT;
camera.update();
}
次に、画面のようにフレームバッファーに描画できます。その後、フレームバッファのテクスチャを画面に描画します。
public void render(){
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
frameBuffer.begin();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.setShader(null); //use default shader
batch.begin();
//draw your game
batch.end();
frameBuffer.end();
batch.setShader(upscaleShader);
batch.begin();
upscaleShader.setUniformf("rubyTextureSize", frameBuffer.getWidth(), frameBuffer.getHeight());//this is the uniform in your shader. I assume it's wanting the scene size in pixels
batch.draw(frameBuffer.getColorBufferTexture(), -1, 1, 2, -2); //full screen quad for no projection matrix, with Y flipped as needed for frame buffer textures
batch.end();
}
がありますまた、あなたがそれは、OpenGL ESで動作しますので、あなたのシェーダに加える必要があるいくつかの変更であり、SpriteBatchは、特定の属性と、均一な名前のために配線されているので:あなたのバーテックスシェーダの上部に
、そして、頂点シェーダで
attribute vec4 a_position;
attribute vec2 a_texCoord;
varying vec2 v_texCoord[5];
:、これはあなたの頂点属性と可変長を(あなたのリンクシェーダが、それはGL ESでは使用できません組み込み変数に頼っているため必要ありません)を定義するために追加gl_Position
行を次のように変更します
gl_Position = a_position; //since we can't rely on built-in variables
と同じ理由でv_texCoord
でgl_TexCoord
の出現をすべて置き換えます。
OpenGL ESと互換性のあるフラグメントシェーダでは、精度を宣言する必要があります。頂点シェーダと同じように
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord[5];
、v_texCoord
でgl_TexCoord
の出現をすべて置き換える:あなたはまた、様々な同じことを宣言し、その先頭にこれを追加する必要があります。 rubyTexture
のすべての出現箇所をu_texture
に置き換えます。これはSpriteBatchが使用するテクスチャ名です。
私はそれがすべてだと思います。私は実際にこれをテストしていないし、私は思い出に行くだろうが、うまくいけばそれはあなたを近づける。
どうやってそれを描いていますか?メッシュを作ったのですかSpriteBatchを使っていますか?私はあなたがFrameBufferからテクスチャを使用していると仮定しますか? – Tenfour04
私のrender()メソッドで 'batch.setShader(shaderProgram);'を使ってシェーダがSpriteBatchに適用されるようにしたら、私はすべてのテクスチャを描画します – ryanrio95