2016-12-08 3 views
1

J'essaye de créer un carré et de mettre un cercle rouge au milieu de celui-ci. Comme vous pouvez le voir dans le vert simple, je la carte (-1, 1) vont à (0,1) Plage:La texture ne rentre pas dans le carré - OpenGL

coord = position.xy*0.5 + vec2(0.5,0.5); 

Si vous regardez le simple.frag, il y a cette ligne:

if(abs(length(coord - vec2(0.5,0.5))) < 0.3) 

Ainsi j'attends un cercle rouge au milieu du carré. Cependant cela se produit:

enter image description here

Le centre du cercle est au-delà de (0,5, 0,5). Si je change cette ligne à ceci:

if(abs(length(coord - vec2(0.0,0.0))) < 0.3) 

sortie est:

enter image description here

Le centre du cercle est au coin inférieur gauche comme prévu. Cependant, ne devrait pas être le coin supérieur droit (1,1)? De plus, le cercle n'est pas un cercle parfait. Qu'est-ce que je rate?

initialisations:

Shader simpleShader("simple.vert", "simple.frag"); 
Shader quadShader("quad.vert", "quad.frag"); 


GLfloat inVertices[] = { 

    -1.0f, 1.0f, 0.0, 
    -1.0f, -1.0f, 0.0, 
    1.0f, -1.0f, 0.0, 

    -1.0f, 1.0f, 0.0, 
    1.0f, -1.0f, 0.0, 
    1.0f, 1.0f, 0.0 }; 


GLfloat quadVertices[] = { 

    -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 
    -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 

    -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 
    1.0f, -1.0f, 0.0f, 1.0f, 0.0f, 
    1.0f, 1.0f, 0.0f, 1.0f, 1.0f 
}; 


GLuint inVAO, inVBO; 
glGenVertexArrays(1, &inVAO); 
glGenBuffers(1, &inVBO); 
glBindVertexArray(inVAO); 
glBindBuffer(GL_ARRAY_BUFFER, inVBO); 
glBufferData(GL_ARRAY_BUFFER, sizeof(inVertices), &inVertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); 
glBindVertexArray(0); 


GLuint quadVAO, quadVBO; 
glGenVertexArrays(1, &quadVAO); 
glGenBuffers(1, &quadVBO); 
glBindVertexArray(quadVAO); 
glBindBuffer(GL_ARRAY_BUFFER, quadVBO); 
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); 
glBindVertexArray(0); 





GLuint textureColorbuffer; 
glGenTextures(1, &textureColorbuffer); 
glBindTexture(GL_TEXTURE_2D, textureColorbuffer); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glBindTexture(GL_TEXTURE_2D, 0); 

GLuint framebuffer; 
glGenFramebuffers(1, &framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
// Create a color attachment texture 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); 
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
    std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!" << std::endl; 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

boucle principale;

glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    // Draw our first triangle 
    simpleShader.Use(); 
    glBindVertexArray(inVAO); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 

    glBindVertexArray(0); 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 


    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
    quadShader.Use(); 
    modelLoc = glGetUniformLocation(quadShader.Program, "model"); 
    viewLoc = glGetUniformLocation(quadShader.Program, "view"); 
    projLoc = glGetUniformLocation(quadShader.Program, "projection"); 
    glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); 
    glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); 
    glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection)); 

    glBindVertexArray(quadVAO); 
    glBindTexture(GL_TEXTURE_2D, textureColorbuffer); // Use the color attachment texture as the texture of the quad plane 
    glDrawArrays(GL_TRIANGLES, 0, 6); 
    glBindVertexArray(0); 

    // Swap the screen buffers 
    glfwSwapBuffers(window); 

simple.vert:

#version 330 core 

layout (location = 0) in vec3 position; 
out vec2 coord; 
void main(){ 
    coord = position.xy*0.5 + vec2(0.5,0.5); 
    gl_Position = vec4(position, 1.0f); 
} 

simple.frag:

#version 330 core 
in vec2 coord; 
out vec4 color; 
void main(){ 
    if(abs(length(coord - vec2(0.5,0.5))) < 0.3) 
     color = vec4(1.0f, 0.0f, 0.0f, 1.0f); 
    else 
     color = vec4(0.0f, 1.0f, 0.0f, 1.0f); 
} 

quad.vert:

#version 330 core 
layout (location = 0) in vec3 position; 
layout (location = 1) in vec2 texCoords; 
uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 
out vec2 TexCoords; 

void main() 
{ 
    gl_Position = projection * view * model * vec4(position, 1.0f); 
    TexCoords = texCoords; 
} 

quad.frag:

#version 330 core 
in vec2 TexCoords; 
out vec4 color; 

uniform sampler2D screenTexture; 

void main() 
{ 
    color = texture(screenTexture, TexCoords); 
} 
+0

Dépend de quelles données vous alimentez. Vous devriez certainement écrire une courte introduction à votre question (qu'essayez-vous de faire ...). Commencer avec tout un tas de code n'est jamais une bonne idée. Lire [demander]. –

+0

J'ai édité la question. –

+0

Affiche les sommets quadruples. Je suppose, 'inVAO' est juste un quad plein écran? –

Répondre

5

Vous devez modifier votre fenêtre d'affichage lorsque vous dessinez sur la texture. Si vous utilisez la fenêtre de la fenêtre, OpenGL suppose que la texture a la même taille que la fenêtre. Par conséquent, seul le coin inférieur gauche de l'image entière se retrouvera dans la texture.

Donc, avant de rendre à la texture:

glViewport(0, 0, 256, 256); 

... et que nous revenions avant de tirer la scène finale.