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:

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

셰이더 코드에서 텍스처를 사용하지 않는 것을 고려해도 쓰레기를 렌더링합니다! 시사

  1. 텍스처 바인딩없이 렌더링 된 텍스처
  2. source 조직
  3. "엉뚱한"렌더링 텍스처
  4. map 조직
Tenfour04

OpenGL 사양은 프레임 버퍼의 연결된 텍스처를 자체 프레임 버퍼에 렌더링하면 정의되지 않은 결과가 생성된다고 명시되어 있습니다. 또는 "쓰레기". :) 적어도이 특정 GPU에서는 텍스처를 바인딩 할 수 없다는 것을 보여줍니다. 훨씬 적은 샘플입니다.

일반적으로 이와 같은 작업을 수행해야하는 경우 두 개의 FrameBuffer가 필요하며 둘 사이를 핑퐁 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사