GLSL 150 GL 3.2黑色纹理

时间:2014-02-04 21:42:50

标签: c++ opengl glsl

我无法使用我的纹理,所有屏幕都是黑色的。 这是我加载图像的代码,我使用lodepng:

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

我的frag shader(修剪版)基本上是这样做的:

uniform sampler2D sampler;
void main(void) {
    gl_FragColor = texture2D(sampler, uv_coord);
}

UV坐标很好,来自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&amp;&amp; FORWARD_COMPAT。

顶点着色器:

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

3 个答案:

答案 0 :(得分:4)

glUniform1i(shader_sampler_loc, GL_TEXTURE0);

。 。 。应该是

glUniform1i(shader_sampler_loc, 0);

答案 1 :(得分:3)

所以我解决了它,通过使用OPENGL_COMPAT_PROFILE它可以工作。虽然我真的想要完整的3.2,并找到哪些部分已被弃用...

编辑: 就我而言,我终于找到了愚蠢的错误,我正在使用

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

所以我觉得老式GL我很幸运,3.2用枚举改变了?

答案 2 :(得分:0)

评论建议尝试更改以下内容:

顶点着色器:

  • out 而不是变化
  • 在您的属性中添加布局(位置=#),并在中更改属性

    确保,地点数量与代码匹配

片段着色器:(假设它未完成)

  • 而不是变化
  • 将布局(位置=#)添加到您的采样器制服

代码:

更改

glUniform1i(sampler_loc, GL_TEXTURE0) 

glUniform1i(sampler_loc, 0)