我无法使用我的纹理,所有屏幕都是黑色的。 这是我加载图像的代码,我使用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;
}
答案 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)
评论建议尝试更改以下内容:
顶点着色器:
在您的属性中添加布局(位置=#),并在中更改的属性。
确保,地点数量与代码匹配
片段着色器:(假设它未完成)
代码:
更改
glUniform1i(sampler_loc, GL_TEXTURE0)
到
glUniform1i(sampler_loc, 0)