2015-11-07 12 views
5

逆のシーンをフレームバッファにレンダリングするときに助けが必要です。ミラー効果を作りたい。にglScalef(1.0、-1.0、1.0)を使用するところ、私はいくつかのチュートリアルを見逆シーンをフレームバッファにレンダリングする

mView = camera.getViewMatrix(); 
    mProjection = perspective(45.0f, 4.0f/3.0f, 0.1f, 300.0f) * scale(mat4(1.0f), vec3(1.0f, -1.0f, 1.0f)); 
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferName); 
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glCullFace(GL_FRONT); 
    glEnable(GL_CULL_FACE); 
    mWorld = rotate(mWorld, -15.0f, vec3(1, 0, 0)); 
    mWorld = rotate(mWorld, -30.0f, vec3(0, 1, 0)); 
    cubemap.Draw(mView, mProjection, mWorld); 
    glDisable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 
    glUseProgram(program); 
    mWorld = translate(mat4(1.0f), vec3(0, -10, 0)); 
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); 
    cannon.Draw(program); 

    mWorld = mat4(1.0f); 
    mWorld = translate(mat4(1.0f), vec3(50, -10, 0)); 
    mWorld = rotate(mWorld, 90.0f, vec3(0, 1, 0)); 
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); 
    cannon.Draw(program); 

    mWorld = mat4(1.0f); 
    mWorld = translate(mat4(1.0f), vec3(0, -10, 50)); 
    mWorld = rotate(mWorld, 140.0f, vec3(0, 1, 0)); 
    glUniformMatrix4fv(mvp_object, 1, GL_FALSE, value_ptr(mProjection * mView * mWorld * scale(mat4(1.0f), vec3(10.0f)))); 
    cannon.Draw(program); 

    glDisable(GL_DEPTH_TEST); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 

My result フレームバッファの初期化:フレームバッファする

GLuint FramebufferName = 0; 
glGenFramebuffers(1, &FramebufferName); 
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); 

GLuint renderedTexture; 
glGenTextures(1, &renderedTexture); 
glBindTexture(GL_TEXTURE_2D, renderedTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); 
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0); 
glDrawBuffer(GL_COLOR_ATTACHMENT0); 
glReadBuffer(GL_NONE); 

ドローシーンを何私は結果を持っている 反転シーン。 glScalefは古いバージョンのOpenGLで使用されていました。 OpenGLの新しいバージョンではどうやってシーンを反転できますか? このエフェクトでは、スケール(mat4(1.0f)、vec3(1.0、-1.0、1.0))で投影行列を乗算しました。そうですか?

+0

「新しいバージョンのopenglでシーンを反転させるにはどうすればよいですか?」たとえば、シェーダ –

答えて

1

GLSLで書かれた頂点シェーダです。

void main(void) 
{ 
    // Clean up inaccuracies 
    vec2 Pos = sign(gl_Vertex.xy); 

    gl_Position = vec4(Pos.xy, 0.0, 1.0); 
    // Image-space 
    gl_TexCoord[0].xy = vec2(-Pos.x, Pos.y) * 0.5 + 0.5; // x texture coord is inverted  
} 

Posフレームバッファ出力のために整列クワッドをスクリーニングすることを意味します。クワッド整列

フラグメントシェーダ

uniform sampler2D framebufferSampler; 

void main(void) 
{ 
    gl_FragColor = texture2D(framebufferSampler, gl_TexCoord[0].xy); 
} 

画面

glBegin(GL_QUADS) 
{ 
    glVertex2f(-1.0f, -1.0f); 
    glVertex2f(1.0f, -1.0f); 
    glVertex2f(1.0f, 1.0f); 
    glVertex2f(-1.0f, 1.0f); 
} 
glEnd(); 

または頂点アレイを使用して描画することができます。

GLfloat vertices[] = { 
    -1.0f, -1.0f, 
    1.0f, -1.0f, 
    1.0f, 1.0f, 
    -1.0f, 1.0f 
}; 

glEnableClientState(GL_VERTEX_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, (void*)vertices); 

glDrawArrays(GL_QUADS, 0, 4); 

glDisableClientState(GL_VERTEX_ARRAY); 

クワッドにwrapedするために使用されるテクスチャは、以前のレンダリングされたコンテンツ(マルチパスシェーダ技術)とフレームバッファ情報です。

フレームバッファとスクリーンアライメントクワッドの代わりに、他の2Dテクスチャ座標または画像を使用することもできます。

オリジナル画像。画像を反転

enter image description here

enter image description here

詳細情報はLearn OpenGLで見つけることができます。

+0

私は、廃止予定のOpenGLを使用しているときにはかなり悪い例だと言います。 OPがまったくそれを使用しているかどうかは明らかではないので。 – Vallentin

+0

@Vallentin:「非推奨」とはどういう意味ですか? – Mykola

+0

そのようなものは使用しないでください。使用しないでください。それ以上使用できません。 – Vallentin

関連する問題