2015-11-07 5 views
5

में उल्टा दृश्य प्रस्तुत करें मुझे फ्रेमबफर में उलटा दृश्य प्रस्तुत करने में कुछ मदद चाहिए। मैं एक दर्पण प्रभाव बनाना चाहता हूँ। क्या मैं परिणाम में है: My result आरंभ किया जा रहा फ्रेम बफर:फ्रेमबफर

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

मैं करने के लिए कुछ ट्यूटोरियल जहां glScalef (1.0, -1.0, 1.0) का इस्तेमाल किया देखा: बफर फ्रेम करने के लिए

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

"मैं ओपनएल के नए संस्करणों में दृश्य कैसे उलटा सकता हूं?" उदाहरण के लिए shader –

उत्तर

1

यहां जीएलएसएल में लिखे गए वर्टेक्स शेडर हैं।

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 किया जाता था, पिछले गाया सामग्री (बहु शेडर तकनीक) के साथ फ्रेमबफर की जानकारी है।

आप फ्रेमबफर और स्क्रीन संरेखण के बजाय अन्य 2 डी बनावट कॉर्ड या छवियों के साथ ऐसा भी कर सकते हैं।

मूल छवि।

enter image description here

उल्टे छवि।

enter image description here

अधिक जानकारी Learn OpenGL में पाया जा सकता।

+0

में मैं कहूंगा कि यह एक बहुत बुरा उदाहरण है, जब आप बहिष्कृत ओपनजीएल का उपयोग कर रहे हैं। चूंकि यह भी स्पष्ट नहीं है कि ओपी इसका उपयोग कर रहा है या नहीं। – Vallentin

+0

@ वेलेंटीन: आपका मतलब क्या है 'बहिष्कृत'। – Mykola

+0

इसमें उल्लिखित नहीं किया जाना चाहिए और इसमें बहिष्कृत नहीं किया जाना चाहिए अब और काम नहीं करता है। – Vallentin

संबंधित मुद्दे