3

ここに私のレンダリングループがあります:

  1. カスタム FBO をバインドする
  2. テクスチャをバインドします (以前は COLOR_ATTACHMENT0 として FBO に関連付けられていました)。
  3. フラクタル アルゴリズムに基づいてフラグメントの色を選択するカスタム フラグメント シェーダーを使用してレンダリングします。(フラグメントがアルゴリズムで使用されていない場合は、黒が割り当てられます)
  4. ウィンドウ提供のフレームバッファとレンダバッファを再バインドします。(iOS 5 では、これは [view bindDrawable] メソッドです。
  5. 画面を白くクリアします。
  6. ウィンドウ自体よりも大幅に小さいフレームに fbo テクスチャをレンダリングします。

期待される結果: フラクタルが小さいフレームに表示されるはずです。フレームの背景は黒にする必要があります。画面の残りの部分は白でなければなりません。

現在の結果: fbo で提供されたウィンドウとカスタム fbo/テクスチャにレンダリングしているかのように、画面全体がフラクタルによって占められています。

何が間違っているのか本当にわからないので、助けていただければ幸いです。

編集:

フラグメント シェーダー:

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

...実際にクリアが行われるのは、ウィンドウが提供するフレームバッファです。

助けてくれてありがとう。

4

0 に答える 0