Я не могу заставить свои текстуры работать, весь экран черный. Вот мой код для загрузки изображений, я использую lodepng:GLSL 150 GL 3.2 черные текстуры
std::vector<unsigned char> image;
unsigned int error = lodepng::decode(image, w, h, filename);
GLuint texture_id;
glGenTextures(1, &texture_id);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, &image[0]);
glBindTexture(GL_TEXTURE_2D, 0);
Для рендеринга я это сделать:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id_from_above); //texture_id were checked, seemed fine
glUniform1i(shader_sampler_loc, GL_TEXTURE0);
и мой фраг шейдер (обрезанная версия) в основном делает это:
uniform sampler2D sampler;
void main(void) {
gl_FragColor = texture2D(sampler, uv_coord);
}
УФ-координаты являются точными, вектор от lodepng содержит много элементов и нет ошибки. Для дальнейшего придавить проблему, я попытался это:
gl_FragColor = texture2D(sampler, uv_coord)*0.5 + vec4(1, 1, 1, 1)*0.5f
Чтобы увидеть, если все назначение как-то пропустил или текстуру на самом деле черный. В результате я все еще получаю только черное окно. Но, удалив
glActiveTexture(GL_TEXTURE0); //x2, and
glUniform1i(sampler_loc, GL_TEXTURE0);
все мои объекты выглядят серыми. Я не знаю, что не так.
BTW: он работал перед переходом на OpenGL 3.2 (раньше был 2.1), а все изображения -^2. Я использую CORE_PROFILE & & FORWARD_COMPAT.
Vertex шейдеров:
#version 150
//VBO vertex attributes
attribute vec3 pos;
attribute vec2 tex;
attribute vec3 normal;
varying vec2 uv_coord;
uniform mat4 mvp_mat;
void main(void) {
gl_Position = mvp_mat * vec4(pos, 1);
uv_coord = tex;
}
Можете ли вы разместить свой вершинный шейдер, из какой версии OpenGL вы обновили? – felknight
Это также не шейдер GLSL 1.50, это GLSL 1.10. Некоторые ленивые реализации GLSL позволят вам использовать вещи из GLSL 1.50 без правильной директивы '# version', но это плохая форма. Это, однако, не имеет значения, потому что вы ничего не используете из GLSL 1.50 и даже используете функцию устаревших текстур fetch: 'texture2D (...)' - начиная с GLSL 1.30, вы должны использовать перегруженную текстуру (...) '. –
Поцарапайте, что с вашими новыми изменениями вы сказали GL, что это шейдер GLSL 1.50, но вы используете синтаксис GLSL 1.1/1.2. Вы должны использовать 'in' и' out' вместо 'attribute' и' changeing', потому что они устарели. Пока вы на нем, замените 'attribute vec3 pos' на' in vec4 pos', тогда вам не придется писать 'vec4 (pos, 1)'. Все атрибуты вершин в OpenGL всегда 4-мерные, даже если вы даете им достаточно данных для трех измерений, GL будет заполнять ** 1.0 ** для W автоматически (но это преимущество появляется только в том случае, если вы правильно объявляете его как 'vec4 'в первую очередь). –