Programim dhe zhvillim, javascript, python, php, html

OpenGL nuk shfaqet në ekran duke telefonuar glBindFramebuffer(GL_FRAMEBUFFER,0)

Normalisht, ky kod e jep imazhin e teksturës në ekran. Por nëse tani shtoj komandën glBindFramebuffer(GL_FRAMEBUFFER,0) në kod, ai nuk do të japë asgjë. Ai i jep ekranet vetëm në ngjyrën e glClearColor. Unë jam duke punuar me QT duke përdorur QOpenGLWidget.

glViewport(0, 0, _width, _height);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

glClearColor(0.0,0.0,0.0,1.0);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
glDisable(GL_DEPTH_TEST);

_program.bind();
glBindVertexArray(_vao);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniform1i(glGetUniformLocation(_program.programId(), "u_texture"), 1);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);

Dëshironi mund të shkojnë keq?

EDIT:

/* final.fsh */

versioni 330 bërthama

uniform sampler2D u_texture;
in vec4 qt_TexCoord0;

out vec4 fragColor;

void main(void)
{
    fragColor = texture(u_texture, qt_TexCoord0.xy);
}

/* final.vsh */

versioni 330 bërthama

layout (location = 0) in vec3 a_position;

out vec4 qt_TexCoord0;

void main(void)
{
    gl_Position =  vec4(a_position, 1.0);

    const mat4 B = mat4(0.5,  0.0, 0.0, 0.0,
                            0.0,  0.5, 0.0, 0.0,
                            0.0,  0.0, 0.5, 0.0,
                            0.5,  0.5, 0.5, 1.0);

    qt_TexCoord0 = B * vec4(a_position, 1.0);
}

/* Ngarkon VAO në GPU */

GLfloat max_ = 1.0;
GLfloat min_ = -1.0;
GLfloat vert[] = {
    max_,  max_, 0,
    max_, min_, 0,
    min_, max_, 0,

    max_,  min_, 0,
    min_, min_, 0,
    min_,  max_, 0,
};

glGenVertexArrays(1, &_vao);
glBindVertexArray(_vao);

GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

glBufferData(GL_ARRAY_BUFFER, sizeof(vert), vert, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, (GLvoid*)0);
glBindVertexArray(0);
25.02.2017

  • Thirrja e glBindFramebuffer me një objektiv prej 0 do të prish çdo lidhje ekzistuese për GL_FRAMEBUFFER . Duke qenë se është kështu, nuk është e qartë pse po e quani atë. Cili është qëllimi? 25.02.2017
  • Ideja është që në të ardhmen të kemi disa thirrje shtesë të renderimit në një buffer të kornizës. Dhe më pas kaloni rezultatin tek ai kod për të shfaqur rezultatin në ekran. 25.02.2017
  • glDrawBuffer(GL_BACK) duhet të bëjë mashtrimin mendoj 25.02.2017
  • Mhh, nuk e di se si mund të ndihmojë kjo. Ku duhet të qëndrojë kjo? Unë nuk lidh asnjë tampon kornizë. 25.02.2017

Përgjigjet:


1

Siç thuhet nga G.M., dhe sipas dokumenteve, glBindFramebuffer(GL_FRAMEBUFFER, 0) "prish lidhjen ekzistuese të një objekti framebuffer me objektiv". Ju duhet kjo telefonatë pasi të keni përdorur framebuffer-ët tuaj për të bërë disa paraqitje jashtë ekranit. Kur dëshironi të jepni më në fund në ekran, duhet të jepni bufferin e pasëm, duke thirrur glDrawBuffer(GL_BACK).

Pra, cikli juaj i renderit mund të duket si

// Do some rendering stuff in n offscreen textures
glBindFramebuffer(GL_FRAMEBUFFER, the_buffer);
glDrawBuffers(n, buffers);
// Rendering calls

// Finally use the results for the final rendering 
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDrawBuffer(GL_BACK);
// Rendering calls

EDIT: Duket se po përdorni QOpenGLWidget si ofruesin tuaj OpenGL / sistemin e dritares. Djemtë Qt po përdorin framebuffer për të dhënë ndërfaqen e tyre të ndërfaqes, dhe përmbajtja e rezultatit të QOpenGLWidget tuaj është tërhequr brenda një FBO.

Pra, ajo që do të thotë (të paktën në përvojën time, mund të ketë një mënyrë më të mirë për të trajtuar këtë problem), është se nuk mund të jepni më në backbuffer, duhet të jepni në Qts framebuffer.

Një mënyrë për ta bërë këtë (përsëri, mund të mos jetë fare mënyra më e mirë, por ka funksionuar për mua), është të ruani kornizën e kufizuar në fillim të paraqitjes tuaj dhe të bëni paraqitjen tuaj përfundimtare në këtë buffer. Që çon në

// First of all, save the already bound framebuffer
GLint qt_buffer;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &qt_buffer);

// Do some rendering stuff in n offscreen textures
glBindFramebuffer(GL_FRAMEBUFFER, your_buffer);
glDrawBuffers(n, buffers);
// Rendering calls

// Finally use the results for the final rendering 
if (glIsFramebuffer(qt_buffer))
{
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glDrawBuffer(GL_BACK);
}
else
{
    glBindFramebuffer(GL_FRAMEBUFFER, qt_buffer);
    glDrawBuffers(1, buffers);
}
// Rendering calls
25.02.2017
  • Ok, për ta testuar atë, dyfishova kodin tim. Dhe ndryshoi glBindFramebuffer në një FBO të krijuar me sukses. me : shtojcën GLuint[2] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; glDrawBuffers (2, bashkëngjitje); Dhe pjesa tjetër si ju treguat, duke lidhur 0 përsëri me Framebuffer me glDrawBuffer. Por asgjë nuk ndryshoi 25.02.2017
  • Prisni, po përdorni QOpenGLWidget të Qt? 25.02.2017
  • Po, a ka ndonjë ndryshim? 25.02.2017
  • Oh po. Kjo funksionoi ^^ Unë në fakt përdora GL_FRAMEBUFFER_BINDING për të marrë FBO-në. Por e thirra pasi inicializova OpenGL, dhe aty më tha se ishte 0 ^^. Por po, më duhej ta zhvendosja në paintGL(). Faleminderit 25.02.2017
  • Më vjen mirë që e bën punën :) A mund t'ju sugjeroj të redaktoni pyetjen tuaj për të përfshirë faktin që po përdorni QOpenGLWidget? Mund të ndihmojë të tjerët :) 25.02.2017
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..