다음 두 셰이더가 있습니다. 정점 셰이더 :
/// 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);
...
셰이더 코드에서 텍스처를 사용하지 않는 것을 고려해도 쓰레기를 렌더링합니다!
source
조직 map
조직OpenGL 사양은 프레임 버퍼의 연결된 텍스처를 자체 프레임 버퍼에 렌더링하면 정의되지 않은 결과가 생성된다고 명시되어 있습니다. 또는 "쓰레기". :) 적어도이 특정 GPU에서는 텍스처를 바인딩 할 수 없다는 것을 보여줍니다. 훨씬 적은 샘플입니다.
일반적으로 이와 같은 작업을 수행해야하는 경우 두 개의 FrameBuffer가 필요하며 둘 사이를 핑퐁 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다