2014-02-04 6 views
2

Я не могу заставить свои текстуры работать, весь экран черный. Вот мой код для загрузки изображений, я использую 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; 
} 
+0

Можете ли вы разместить свой вершинный шейдер, из какой версии OpenGL вы обновили? – felknight

+0

Это также не шейдер GLSL 1.50, это GLSL 1.10. Некоторые ленивые реализации GLSL позволят вам использовать вещи из GLSL 1.50 без правильной директивы '# version', но это плохая форма. Это, однако, не имеет значения, потому что вы ничего не используете из GLSL 1.50 и даже используете функцию устаревших текстур fetch: 'texture2D (...)' - начиная с GLSL 1.30, вы должны использовать перегруженную текстуру (...) '. –

+2

Поцарапайте, что с вашими новыми изменениями вы сказали 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 'в первую очередь). –

ответ

3

Так я вроде решил ее, используя OPENGL_COMPAT_PROFILE это работает. Хотя я действительно хотел бы пойти полный 3.2, и выяснить, какие части устарели ...

EDIT: В моем случае, я, наконец, нашел тупую ошибку, я использовал

glTexImage2D(GL_TEXTURE_2D, 0, 4, ... //instead of 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ... 

Так что я думаю со старым GL мне повезло, а с 3.2 изменено перечисление?

+0

Профили совместимости *** заполнены *** 3.2, на самом деле основной профиль является только * частичным * 3.2. Тем не менее, некоторые реализации не предлагают «полный» 3.2 и *, что * является фактической причиной, по которой вы хотели бы избежать устаревших частей API. –

+0

Хорошо, хотя osx, похоже, «вынуждает» меня использовать совместимость с 3.2 ядрами: «NSGL: целевая версия OS X поддерживает только OpenGL версии 3.2 и более поздние версии, если они совместимы с прямой», «NSGL: целевая версия ОС X поддерживает только OpenGL 3.2 и более поздние версии, если они используют основной профиль « – Teris

+0

Да, это то, что я подразумевал под некоторыми реализациями, не предлагает полного 3.2. Mesa и OS X, например. Вы ограничены функциональностью основного профиля. На других платформах вы можете использовать весь старый API вместе с OpenGL 4.3, если хотите. –

4
glUniform1i(shader_sampler_loc, GL_TEXTURE0); 

. , , должны быть

glUniform1i(shader_sampler_loc, 0); 

т.д.

+0

Хорошо, я просто попробовал. Объекты кажутся серыми из-за моего шейдера. Но все еще нет текстур ..:/ – Teris

0

В комментарии предлагаю попробовать изменить следующее:

Vertex Shader:

  • из вместо различной
  • Добавить раскладку (местоположение = #) к вашим атрибутам и изменить атрибут для в.

    Убедитесь, количество мест соответствует коду

пиксельный шейдер: (Если предположить, так как его не завершена)

  • в вместо различной
  • Добавить макет (местоположение = #) до вашей формы сэмплера

Для кода:

Изменить

glUniform1i(sampler_loc, GL_TEXTURE0) 

в

glUniform1i(sampler_loc, 0) 
+0

Хорошо, все это, все та же проблема. Хотя я не уверен, какое место использовать для униформы. – Teris

+0

Любые ошибки или предупреждения, вы пробовали использовать glGetShaderInfoLog? – felknight

+0

Нет ошибок или предупреждений, и я использую shaderinfolog. – Teris

Смежные вопросы