2015-11-07 15 views
5

Tôi cần một số trợ giúp với hiển thị cảnh đảo ngược cho bộ đệm khung. Tôi muốn tạo hiệu ứng gương. gì tôi có trong kết quả: My result Khởi tạo bộ đệm khung:Hiển thị cảnh đảo ngược sang framebuffer

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

Draw trường để đóng khung đệm:

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

tôi thấy một số hướng dẫn sử dụng nơi glScalef (1.0, -1.0, 1.0) để cảnh nghịch đảo. glScalef được sử dụng trong các phiên bản cũ của opengl. Làm thế nào tôi có thể đảo ngược cảnh trong phiên bản mới của opengl? Tôi đã nhân ma trận chiếu trên thang đo (mat4 (1.0f), vec3 (1.0, -1.0, 1.0)) cho hiệu ứng này. Đúng không?

+0

"Làm thế nào tôi có thể đảo ngược cảnh trong phiên bản mới của opengl?" ví dụ: trong trình đổ bóng –

Trả lời

1

Đây là trình đổ bóng đỉnh được viết bằng 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 đề cập đến quad căn chỉnh màn hình cho đầu ra bộ đệm khung.

Fragment Shader

uniform sampler2D framebufferSampler; 

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

Screen thẳng hàng quad thể được rút ra

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

hoặc sử dụng mảng đỉnh.

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

kết cấu được sử dụng để bọc vào tứ giác, là thông tin framebuffer với nội dung được hiển thị trước đó (kỹ thuật tạo bóng nhiều lần).

Bạn cũng có thể làm như vậy với các thanh công cụ hoặc hình ảnh kết cấu 2D khác thay vì khung hình chữ nổi và khung hình căn chỉnh.

Hình ảnh gốc.

enter image description here

Hình ảnh ngược.

enter image description here

Thông tin thêm có thể được tìm thấy trong Learn OpenGL.

+0

Tôi có thể nói đây là một ví dụ khá tệ khi bạn sử dụng OpenGL không được chấp nhận. Vì không rõ liệu OP có sử dụng nó hay không. – Vallentin

+0

@Vallentin: Ý của bạn là 'Không được chấp nhận'. – Mykola

+0

Không được sử dụng như trong nó không nên được sử dụng và không được chấp nhận như trong nó không hoạt động nữa. – Vallentin

Các vấn đề liên quan