2012-04-21 8 views
7

Estoy intentando dibujar un cubo con una textura FBO. La textura se representa correctamente (que puedo ver en gDebugger), pero no se representa en el cubo. Pensé que esto podría ser un problema con la textura FBO, así que cargué una textura normal y la intenté también, pero tengo el mismo problema, solo un cubo negro.Textura cargada y encuadernada, pero el sombreador de fragmentos no la representa

Pasando por el programa en gDebugger, puedo ver que la textura está cargada correctamente y encuadernada, pero no se dibuja nada. Tampoco parece haber ningún problema con los texcoords. Tenga en cuenta que también he tratado de generar un color sólido en el sombreador de fragmentos que funciona correctamente.

Esta es mi sombreado de vértices:

#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; 
} 

y este es mi fragmento de sombreado:

#version 420 

uniform sampler2D tex; 

in vec2 f_texcoord; 

out vec4 gl_FragColor; 

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

Y esto es donde trazo el 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); 

debo estar ciego, porque no veo errores

(También, tenga en cuenta que estoy usando SFML y GLEW para la creación de contexto y extensiones.)

EDIT:

No sé si esto va a ser útil, pero esto es cómo he definido el cubo VBO, uniformes, etc .:

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

¿Revisa el registro de errores cuando compila el sombreador/vincula el programa? Lo único que veo que podría ser el problema es que las variables que comienzan con 'gl_' están reservadas y el shader de fragmentación puede estar devolviendo un error debido a su variable' gl_FragColor'. –

+0

oh sí, y no parece que estés vinculando ningún atributo de vértice, por lo que en realidad no estás dibujando nada. –

+0

El dibujo está bien, no incluí la parte donde configuré mis VBO: s, etc. El cubo se representa como debería, pero sin texturizar. Como dije en la pregunta, usar gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0) representa con éxito un cubo rojo. En cuanto al registro de errores, está vacío. Puedo agregar la configuración de VBO si lo desea. – Merigrim

Respuesta

7

=== === EDITAR

parece que se está perdiendo la textu re configuración para el filtro de minificación, que es un problema si no está utilizando una textura mipmapped. Vea aquí: http://www.opengl.org/wiki/Common_Mistakes#Creating_a_complete_texture

+1

Sí, lo hago en mi código de inicialización. También intenté agregarlo justo antes de dibujar el cubo, pero desafortunadamente obtuve el mismo resultado. – Merigrim

+0

@Merigrim ¿puedes poner todo el código de inicialización? No hay nada en lo que tienes actualmente allí que pueda causar un problema, según mi leal saber y entender. – Tim

+0

Bien, solo un minuto. – Merigrim

Cuestiones relacionadas