2012-04-21 11 views
7

Sto provando a disegnare un cubo con una trama FBO. La texture viene renderizzata correttamente (che posso vedere in gDebugger), ma non esegue il rendering sul cubo. Ho pensato che questo potesse essere un problema con la trama dell'FBO, quindi ho caricato una texture normale e l'ho provato, ma ho lo stesso problema, solo un cubo nero.Texture caricata e rilegata, ma frammento shader non lo rende

Passando attraverso il programma in gDebugger, vedo che la trama viene caricata correttamente e vincolata, ma non viene disegnato nulla. Inoltre, non sembrano esserci problemi con i texcoords. Nota che ho anche provato ad emettere un colore solido nello shader del frammento che funziona correttamente.

Questo è il mio vertex shader:

#version 420 

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 model; 

layout(location = 0) in vec3 vertex; 
layout(location = 1) in vec2 texcoord; 

out vec2 f_texcoord; 

void main() { 
    gl_Position = projection * view * model * vec4(vertex, 1.0); 
    f_texcoord = texcoord; 
} 

E questo è il mio frammento di shader:

#version 420 

uniform sampler2D tex; 

in vec2 f_texcoord; 

out vec4 gl_FragColor; 

void main() { 
    gl_FragColor = texture2D(tex, f_texcoord); 
} 

e questo è dove posso disegnare il cubo:

ShaderManager::Get("world")->Use(); 
glBindVertexArray(cube_vao); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex); 
glDrawArrays(GL_TRIANGLES, 0, 36); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindVertexArray(0); 

devo essere cieco, perché non vedo errori.

(Inoltre, si ricorda che sto usando SFML e GLEW per la creazione di contesto e le estensioni.)

EDIT:

Non so se questo sarà utile, ma questo è come ho creato il cubo VBO, uniformi, ecc .:

glClearColor(1.0, 0.0, 0.0, 1.0); 

glEnable(GL_DEPTH_TEST); 

glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
sf::Image img; 
img.LoadFromFile("test.png"); 
img.FlipVertically(); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.GetWidth(), img.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.GetPixelsPtr()); 
glBindTexture(GL_TEXTURE_2D, 0); 

ShaderTime = 0.0; 
camz = -4.0f; 
rotation_y = 0.0f; 

Shader* shader = ShaderManager::Load("shader", "fx.vert", "fx.frag"); 
Shader* world = ShaderManager::Load("world", "world.vert", "world.frag"); 
shader->Use(); 
glUniform1f(glGetUniformLocation(shader->GetId(), "time"), ShaderTime); 
world->Use(); 
glm::mat4 proj = glm::perspective(60.0f, (float)WINDOW_WIDTH/(float)WINDOW_HEIGHT, 0.1f, 1000.0f); 
glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, camz)); 
glm::mat4 model; 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "projection"), 1, GL_FALSE, glm::value_ptr(proj)); 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
glUniformMatrix4fv(glGetUniformLocation(world->GetId(), "model"), 1, GL_FALSE, glm::value_ptr(model)); 
glUniform1i(glGetUniformLocation(world->GetId(), "tex"), 0); 

glGenVertexArrays(1, &cube_vao); 
glBindVertexArray(cube_vao); 
glGenBuffers(1, &cube_vbo); 
glBindBuffer(GL_ARRAY_BUFFER, cube_vbo); 

GLfloat* data = new GLfloat[5 * 36] { 
    // Front 
    -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 1.0f,  1.0f, -1.0f, 1.0f, 1.0f, 0.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 

    // Back 
    -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, -1.0f, 1.0f, 1.0f,  1.0f, -1.0f, -1.0f, 1.0f, 0.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 

    // Top 
    -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, -1.0f, 1.0f, 1.0f,  1.0f, 1.0f, 1.0f, 1.0f, 1.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 

    // Bottom 
    -1.0f, -1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 1.0f,  1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 
    1.0f, -1.0f, -1.0f, 1.0f, 1.0f,  1.0f, -1.0f, 1.0f, 1.0f, 1.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 

    // Left 
    -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 
    -1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 

    // Right 
    1.0f, -1.0f, -1.0f, 0.0f, 0.0f,  1.0f, 1.0f, -1.0f, 0.0f, 1.0f,  1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 0.0f, 1.0f,  1.0f, -1.0f, 1.0f, 0.0f, 0.0f,  1.0f, -1.0f, -1.0f, 0.0f, 0.0f 
}; 

glBufferData(GL_ARRAY_BUFFER, (5 * 36) * sizeof(GLfloat), data, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLvoid*)(0)); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLvoid*)(sizeof(GLfloat) * 3)); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
+0

Controllate il registro degli errori quando compilate lo shader/collegate il programma? L'unica cosa che vedo potrebbe essere il problema è che le variabili che iniziano con 'gl_' sono riservate e il frag shader potrebbe restituire un errore a causa della variabile' gl_FragColor'. –

+0

oh sì, e non sembra che tu stia legando gli attributi di vertice, quindi in realtà non stai disegnando nulla. –

+0

Il disegno va bene, non ho incluso la parte in cui ho impostato il mio VBO: s, ecc. Il cubo è reso come dovrebbe, ma senza texturing. Come ho affermato nella domanda, utilizzando gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0) esegue correttamente il rendering di un cubo rosso. Per quanto riguarda il registro degli errori, è vuoto. Posso aggiungere l'installazione VBO se vuoi. – Merigrim

risposta

7

=== === EDIT

sembra che vi state perdendo il textu re impostazioni per il filtro di minificazione, che è un problema se non stai usando una texture mipmapped. Vedi qui: http://www.opengl.org/wiki/Common_Mistakes#Creating_a_complete_texture

+1

Sì, lo faccio nel mio codice di inizializzazione. Ho anche provato ad aggiungerlo appena prima di disegnare il cubo, ma purtroppo ottengo lo stesso risultato. – Merigrim

+0

@Merigrim puoi inserire tutto il codice di inizializzazione? Non c'è niente in quello che hai attualmente lassù che potrebbe causare un problema, per quanto ne so. – Tim

+0

Ok, solo un minuto. – Merigrim

Problemi correlati