2016-08-09 3 views
0

У меня есть следующие два шейдеры: вершинный шейдер:LibGDX OpenGL вопрос

/// 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; 
} 

Очевидно, что это оказывает полный экран градиентной заливкой прямоугольник. Я создал программу, с этими двумя шейдер и вынес 4 вершины в фреймбуфер и вернуть вынесенный цвет текстуру из него:

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(); 
} 

Обращает вынесенную текстуру с SpriteBatch:

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

Он хорошо работает и делает градиент-заполненный прямоугольник, как я хочу. Когда я связать две текстуры (передаются в качестве параметров для apply метода - source и map) после meginning программы:

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

Это делает дерьмо, даже учитывая то, что я не использую текстур в коде шейдера! preview

  1. текстуры оказывается без каких-либо текстуры привязок
  2. source текстуры
  3. "херово" оказали текстуры
  4. map текстуры
+0

Как могут быть части в (3), которые не находятся в (2)? Например, «TNT» или «die» никогда не встречается ни в одной из входных текстур, которые вы показываете. У вас есть дополнительные текстуры, содержащие эти данные? – BDL

+0

Это одна из текстур, которые я ранее загружал до вызова 'apply'. Он обеспечивает спрайты для второго изображения. Это не куча текстур, это одна текстура. –

ответ

1

OpenGL спецификации указывается, что делает прилагаемую структуру кадра буфер на свой собственный буфер буфера создает неопределенные результаты. Или «дерьмо», по вашим словам. :) Я предполагаю, что это показывает, что по крайней мере на этом конкретном графическом процессоре вы не можете даже привязать текстуру, а тем более образец от нее.

Как правило, если вам нужно сделать что-то подобное, вам понадобятся два FrameBuffers, и вы можете пинг-понг между ними.

+0

Я создал 2 фреймбуфера. Первый из них - для рендеринга сцены, а второй - для рендеринга огней. Затем я получаю две цветные текстуры из этих буферов и использую функцию «apply», чтобы передать их в третий фреймбуфер. Интересная вещь в следующем методе «apply». Когда я привязываю одну из текстур к 0 (т. Е. GL_TEXTURE0), она дает тот же результат, что и при отсутствии текстур. Но когда я привязываю одну текстуру к ненулевой текстурной единице (т. Е. GL_TEXTURE1 и др.), Она создает «дрянную» текстуру. –

+1

@RealFresh SpriteBatch предполагает, что активная единица текстуры равна 0. Поэтому, если вы привязывали текстуры к другим единицам, вам нужно убедиться, что вы вызываете 'Gdx.gl.glActiveTexture (GL20.GL_TEXTURE0)', чтобы вернуть его обратно до 0 'batch.begin()'. – Tenfour04

+0

спасибо, теперь он работает хорошо. Я никогда не думал, что SpriteBatch не устанавливает glActiveTexture по умолчанию. –

Смежные вопросы