2016-04-15 28 views
1

私はLibGDXのシェーダに着いていましたが、LibGDXで使用されている属性がいくつかあることに気付きました。OpenGL HQXシェーダをLibGDXに変換する

https://github.com/libgdx/libgdx/wiki/Shadersの標準的な頂点シェーダとフラグメントシェーダが機能し、SpriteBatchに適用されます。

私がhttps://github.com/SupSuper/OpenXcom/blob/master/bin/common/Shaders/HQ2x.OpenGL.shaderのようなHQXシェーダを使用しようとすると、多くのエラーが発生します。

おそらく、私はシェイダーにいくつかのLibGDX従属変数を送る必要があるのでしょうが、私はそれがどれであるべきかを知ることができません。

大画面のデスクトップでこれらのシェーダを使用したいので、これらの画面でゲームの見栄えがよくなります。

私はシェーダをロードするには、このコードを使用:

try { shaderProgram = new ShaderProgram(Gdx.files.internal("vertex.glsl").readString(), Gdx.files.internal("fragment.glsl").readString()); shaderProgram.pedantic = false; System.out.println("Shader Log:"); System.out.println(shaderProgram.getLog()); } catch(Exception ex) { }

シェーダログ出力:事前に No errors.

感謝を。

+0

どうやってそれを描いていますか?メッシュを作ったのですかSpriteBatchを使っていますか?私はあなたがFrameBufferからテクスチャを使用していると仮定しますか? – Tenfour04

+0

私のrender()メソッドで 'batch.setShader(shaderProgram);'を使ってシェーダがSpriteBatchに適用されるようにしたら、私はすべてのテクスチャを描画します – ryanrio95

答えて

0

あなたの流れは次のように行く必要がありますので、これは、後処理シェーダです:

  1. はSpriteBatchのデフォルトのシェーダを使用してピクセル完璧な解像度でFBOに、あなたのシーンを描画します。

  2. アップスケールシェーダを使用して、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_texCoordgl_TexCoordの出現をすべて置き換えます。

OpenGL ESと互換性のあるフラグメントシェーダでは、精度を宣言する必要があります。頂点シェーダと同じように

#ifdef GL_ES 
precision mediump float; 
#endif 
varying vec2 v_texCoord[5]; 

v_texCoordgl_TexCoordの出現をすべて置き換える:あなたはまた、様々な同じことを宣言し、その先頭にこれを追加する必要があります。 rubyTextureのすべての出現箇所をu_textureに置き換えます。これはSpriteBatchが使用するテクスチャ名です。

私はそれがすべてだと思います。私は実際にこれをテストしていないし、私は思い出に行くだろうが、うまくいけばそれはあなたを近づける。

+0

助けてくれてありがとう、私はこのようなシェーダを持っていますhttp: //pastebin.com/88rmNgVfもうエロスは出ませんが、黒い画面が表示されます。テストすることはできますか? – ryanrio95

+0

クワッドを画面に描いたと仮定すると、シェーダから 'u_projTrans'を削除するか、SpriteBatchの投影行列をidentityに設定する必要があります。それは私が最初に見る唯一の問題です。 – Tenfour04

+0

シェーダは現在動作していますが、テクスチャは影付きになりますが、スクリーン全体が影付きになっていることを除いて、まだテクスチャは互いに影を付けています。これはTiledMapRendererのためです。全体的な目的は、スクリーンにレンダリングされたすべてが1つのテクスチャである必要があります。私はそれを行うことができ、そのテクスチャはシェーダを必要とします。 TiledMapがスキップされるためだと思います。 – ryanrio95

関連する問題