Текстура загружена и привязана, но фрагментный шейдер не #39;#39;39;

Я пытаюсь нарисовать куб с текстурой FBO. Текстура отображается правильно (, что я вижу в gDebugger), но она не отображается на кубе. Я подумал, что это может быть проблема с текстурой FBO, поэтому я загрузил обычную текстуру и попробовал ее, но получил ту же проблему, только черный куб.

Просматривая программу в gDebugger, я вижу, что текстура загружается правильно и привязывается, но ничего не рисуется. С texcoords тоже вроде проблем нет. Обратите внимание, что я также пытался вывести сплошной цвет во фрагментном шейдере, который работает правильно.

Это мой вершинный шейдер:

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

А это мой фрагментный шейдер:

#version 420

uniform sampler2D tex;

in vec2 f_texcoord;

out vec4 gl_FragColor;

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

И здесь я рисую куб:

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

Я должен быть слепым, потому что я не вижу ошибок.

(Также обратите внимание, что я использую SFML и GLEW для создания и расширения контекста.)

РЕДАКТИРОВАТЬ:

Я не знаю, будет ли это полезно, но вот как я настроил куб VBO, униформы и т. д.:

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);
7
задан genpfault 23 April 2012 в 15:20
поделиться