фреймбуфер и использование шейдеров в opengl - PullRequest
5 голосов
/ 09 сентября 2011

Я немного запутался по поводу кадровых буферов. Я хочу использовать кадровый буфер с несколькими прикрепленными текстурами, заполнить каждую текстуру и затем использовать шейдер, чтобы объединить (смешать) все текстуры для создания нового вывода. Звучит легко? да, я тоже так думал, но я этого не понимаю.

Как передать текущую связанную текстуру в шейдер?

1 Ответ

8 голосов
/ 09 сентября 2011

Вам нужно поместить текстуру в определенный слот, а затем использовать сэмплер для чтения из нее. В вашем приложении:

GLuint frameBuffer;
glGenFramebuffersEXT(1, &frameBuffer); //Create a frame buffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frameBuffer); //Bind it so we draw to it
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, yourTexture, 0); //Attach yourTexture so drawing goes into it

//Draw here and it'll go into yourTexture.

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //Unbind the framebuffer so that you can draw normally again

//Here we put the texture in slot 1.
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, yourTexture);
glActiveTexture(GL_TEXTURE0); //Don't forget to go back to GL_TEXTURE0 if you're going to do more drawing later

//Now we tell your shader where to look.
GLint var = glGetUniformLocationARB(yourShaderProgram, "yourSampler");
glUniform1i(var, 1); //We use 1 here because we used GL_TEXTURE1 to bind our texture

А в вашем фрагментном шейдере:

uniform sampler2D yourSampler;

void main()
{
    gl_FragColor = texture2D(yourSampler, whateverCoordinatesYouWant);
}

Вы можете использовать это с GL_TEXTURE2 и так далее, чтобы получить доступ к еще большему количеству текстур в вашем шейдере.

...