2016-08-09 48 views
0

Ich habe nächste zwei Shadern: Vertex-Shader:Libgdx OpenGL Ausgabe

/// fragment shader 
#version 130 

in vec2 vs_uv; 

out vec4 fs_color; 

uniform sampler2D u_source; 
uniform sampler2D u_map; 

void main() { 
    fs_color = vec4(vs_uv, 0, 1); 
} 

/// vertex shader 
#version 130 

out vec2 vs_uv; 

void main() { 
    const vec4 vertices[4] = { 
     vec4(-1, -1, 0, 1), 
     vec4(-1, 1, 0, 0), 
     vec4(1, 1, 1, 0), 
     vec4(1, -1, 1, 1) 
    }; 

    vec4 description = vertices[gl_VertexID]; 
    gl_Position = vec4(description.xy, 0, 1); 
    vs_uv = description.zw; 
} 

Offensichtlich macht es ein Vollbild-Gradienten-gefüllte Rechteck. habe ich ein Programm mit diesen beiden Shadern und 4 Ecken in Framebuffer gemacht und gerendert Farbe Textur Rückkehr von ihm:

public Texture apply(Texture source, Texture map) { 
    m_renderBuffer.begin(); 
    Gdx.gl20.glClear(Gdx.gl20.GL_COLOR_BUFFER_BIT); 
    m_program.begin(); 
    m_program.setUniformi(m_sourceLocation, 0); 
    m_program.setUniformi(m_mapLocation, 1); 
    Gdx.gl20.glDrawArrays(Gdx.gl20.GL_TRIANGLE_FAN, 0, 4); 
    m_program.end(); 
    m_renderBuffer.end(); 

    return m_renderBuffer.getColorBufferTexture(); 
} 

ich mit einem Spritebatch gemacht Textur zeichnen:

m_lightSpriteBatch.begin(); 
m_lightSpriteBatch.draw(lightTexture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
m_lightSpriteBatch.end(); 

Es funktioniert gut und macht gradientengefülltes Rechteck, wie ich will. Wenn ich zwei Texturen binden (als Parameter übergeben für apply Methode - source und map) nach meginning des Programms:

m_program.begin(); 
source.bind(0); 
map.bind(1); 
... 

Es macht auch Mist man bedenkt, was ich keine Texturen in der Shadercode verwenden! preview

  1. Textur ohne Bindungen Textur gerendert
  2. source Textur
  3. "crappy" gerendert Textur
  4. map Textur
+0

Wie kann es Teile in (3) geben, die nicht in (2) sind? Zum Beispiel tritt "TNT" oder "Die" niemals in einer der eingegebenen Texturen auf. Verfügen Sie über zusätzliche Texturen, die diese Daten enthalten? – BDL

+0

Es ist eine der Texturen, die ich zuvor geladen habe, bevor ich 'apply' aufgerufen habe. Es bietet Sprites für das zweite Bild. Es sind keine Texturen, sondern eine Textur. –

Antwort

1

Die OpenGL spec besagt, dass Rendern der beigefügten Textur eines Rahmens puffern auf seinen eigenen Framepuffer erzeugt unbestimmte Ergebnisse. Oder "Mist", in deinen Worten. :) Ich denke, das zeigt, dass man zumindest auf dieser speziellen GPU nicht einmal die Textur binden kann, geschweige denn Probe.

In der Regel, wenn Sie so etwas tun müssen, benötigen Sie zwei FrameBuffers, und Sie können Ping Pong zwischen ihnen.

+0

Ich habe 2 Framebuffer erstellt. Zuerst von ihnen - zum Rendern von Szene und zweiten - zum Rendern von Lichtern. Dann erhalte ich zwei Farbtexturen von diesen Puffern und benutze die "Anwenden" -Funktion, um sie in den dritten Framebuffer zu überführen. Die interessante Sache in 'apply' Methode als nächstes. Wenn ich eine der Texturen an 0 binde (d. H. GL_TEXTURE0), wird das gleiche Ergebnis erzielt, wenn keine Texturen gebunden werden. Aber wenn ich eine der Texturen an eine Nicht-Null-Textureinheit binde (d. H. GL_TEXTURE1 und andere), rendert sie eine "beschissene" Textur. –

+1

@RealFresh SpriteBatch setzt voraus, dass die aktive Textureinheit 0 ist. Wenn Sie also Texturen an andere Einheiten gebunden haben, müssen Sie sicherstellen, dass Sie 'Gdx.gl.glActiveTexture (GL20.GL_TEXTURE0)' aufrufen, um sie auf 0 zurückzusetzen 'batch.begin()'. – Tenfour04

+0

danke, jetzt funktioniert es gut. Ich habe nie gedacht, dass SpriteBatch glActiveTexture standardmäßig nicht setzt. –