Opengl ES 2.0, FBO и фрагментные шейдеры - PullRequest
3 голосов
/ 09 декабря 2011

Вот мой цикл рендеринга:

  1. Свяжите пользовательский FBO
  2. Привязать текстуру (ранее ассоциированную с FBO как COLOR_ATTACHMENT0)
  3. Визуализация с использованием пользовательского фрагментного шейдера, который выбирает цвета фрагментов на основе фрактального алгоритма. (Если фрагмент не используется алгоритмом, ему присваивается черный цвет)
  4. Перепривязать предоставленный окном кадровый буфер и рендер-буфер. (на ios 5 это метод [view bindDrawable].
  5. Очистить экран до белого.
  6. Визуализация текстуры fbo в кадре, который значительно меньше самого окна.

Ожидаемый результат: Фрактал должен появиться в меньшем кадре. Рамка должна иметь черный фон. Остальная часть экрана должна быть белой.

Текущий результат: Весь экран занят фракталом, как будто я рендерился в окно, предоставленное fbo, и в мою собственную fbo / texture.

Я действительно не знаю, что делаю неправильно, поэтому буду благодарен за любую помощь.

РЕДАКТИРОВАТЬ:

Фрагмент шейдера:

void main()
{
   highp vec2 pix = gl_FragCoord.xy;
   lowp vec4 color = vec4(0.0,0.0,0.0,0.0);

   //determine if fragment is part of the fractal using the algorithm
   //if yes, change the value of the color vec4

   gl_FragColor = color;
}

Инициализация FBO:

    //First create and bind the frame buffer
glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

//Create a texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

//Attach the texture to the framebuffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);    
if (status != GL_FRAMEBUFFER_COMPLETE)  {
    printf("\n Incomplete Frame Buffer!");
}

Цикл рендеринга:

{
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, texture);
glViewport(0, 0, width, height);

//Call the fractal render, basically a plane of 4 vertices happening through GL_TRIANGLE_STRIP, but that calls the fragment shader above.

[self.view bindDrawable];
glClearColor(1.0,1.0,1.0,1.0);

matrix4x4 mvp = multiplyMatrices(projectionMatrix, modelView);

glUseProgram(shaderId);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);   
glBindBuffer(GL_ARRAY_BUFFER, texelBuffer);
glVertexAttribPointer(texelLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);

glUniformMatrix4fv(mvpLocation, 1, 0, mvp.val);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glUniform1i(textureLocation, 0);

glDrawArrays(GL_TRIANGLE_STRIP, 0, tVertices);
}

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если вы хотите больше информации о том, что я делаю.

Я также заметил нечто очень странное.

Если после привязки FBO я попробую

glClear(GL_COLOR_BUFFER_BIT);
glClearColor(1.0,0.0,0.0,0.5); 

... это кадровый буфер, предоставляемый окном, в котором фактически происходит очистка.

Спасибо, ребята, за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...