OpenGL3でテクスチャへのレンダリングを実装するのに問題があります。
私の問題は、フレームバッファにレンダリングした後、レンダリングされたオブジェクトが変形したように見えることです。これは、どこかで不正な変換が発生したことを意味している可能性があります。フレームバッファを使用していないときにオブジェクトが正常にレンダリングされるため、これは意味がありません(投稿の下部を参照)。
現在の結果は次のとおりです。
現在の結果http://k.minus.com/jZVgUuLYRtapv.jpg
そして期待される結果はこれでした(または同様のもの、これはちょうどGIMPされました): 期待されるhttp://k.minus.com/jA5rLM8lmXQYL.jpg
したがって、フレームバッファのセットアップコードなどで何か問題が発生していることを意味します。しかし、私は何を見ることができません。
FBOは、次の機能を介して設定されます。
unsigned int fbo_id;
unsigned int depth_buffer;
int m_FBOWidth, m_FBOHeight;
unsigned int m_TextureID;
void initFBO() {
m_FBOWidth = screen_width;
m_FBOHeight = screen_height;
glGenRenderbuffers(1, &depth_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, m_FBOWidth, m_FBOHeight);
glGenTextures(1, &m_TextureID);
glBindTexture(GL_TEXTURE_2D, m_TextureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_FBOWidth, m_FBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glGenFramebuffers(1, &fbo_id);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_id);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_buffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TextureID, 0);
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
これが私の描画ボックスコードです。これは、変換行列を受け取り、適切な関数を呼び出します。Pの現在の値は、射影行列であり、ビュー行列(V)の単位行列です。
void drawBox(const Matrix4& M) {
const Matrix4 MVP = M * V * P;
if (boundshader) {
glUniformMatrix4fv((*boundshader)("MVP"), 1, GL_FALSE, &MVP[0]);
}
glBindVertexArray(vaoID);
glDrawElements(GL_TRIANGLES, sizeof(cube.polygon)/sizeof(cube.polygon[0]), GL_UNSIGNED_INT, 0);
}
void drawStaticBox() {
Matrix4 M(1);
translate(M, Vector3(0,0,-50));
drawBox(M);
}
void drawRotatingBox() {
Matrix4 M(1);
rotate(M, rotation(Vector3(1, 0, 0), rotation_x));
rotate(M, rotation(Vector3(0, 1, 0), rotation_y));
rotate(M, rotation(Vector3(0, 0, 1), rotation_z));
translate(M, Vector3(0,0,-50));
drawBox(M);
}
そして、GLUTによって呼び出される表示関数。
void OnRender() {
/////////////////////////////////////////
// Render to FBO
glClearColor(0, 0, 0.2f,0);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_id);
glViewport(0, 0, m_FBOWidth, m_FBOHeight);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
GL_CHECK_ERRORS
colorshader.Use();
boundshader = &colorshader;
drawRotatingBox();
colorshader.UnUse();
/////////////////////////////////////////
// Render to Window
glClearColor(0, 0, 0, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, screen_width, screen_height);
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
GL_CHECK_ERRORS
texshader.Use();
boundshader = &texshader;
glBindTexture(GL_TEXTURE_2D, m_TextureID);
drawStaticBox();
texshader.UnUse();
// Swap le buffers
glutSwapBuffers();
}
そして...必須のテクスチャシェーダーコード
バーテックス
#version 330
in vec2 vUV;
in vec3 vVertex;
smooth out vec2 vTexCoord;
uniform mat4 MVP;
void main()
{
vTexCoord = vUV;
gl_Position = MVP*vec4(vVertex,1);
}
断片
#version 330
smooth in vec2 vTexCoord;
out vec4 vFragColor;
uniform sampler2D textureMap;
void main(void)
{
vFragColor = texture(textureMap, vTexCoord);
}
以下は、FBOロジックを使用しない場合にレンダリングされるものです。FBOに レンダリングされるものhttp://k.minus.com/jiP7kTOSLLvHk.jpg
... ヘルプ?
私が間違っているかもしれないことについて何か考えはありますか?リクエストに応じて利用可能なさらなるソース。