2016-06-08 80 views
-1

当尝试在片段着色器中使用纹理时,纹理只是全黑。我觉得有一些缺失,但我看过的一切似乎都没问题。这里是我的代码使用质地:片段着色器中的OpenGL纹理黑

GLuint shaderProg = compileShaderPair(vsource, fsource); 
GLint texSampler = glGetUniformLocation(shaderProg, "tex"); 
glUniform1i(texSampler, 0); 
glUseProgram(shaderProg); 
... 
GLuint tex; 
glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
int width, height, components; 
unsigned char* img = stbi_load("texture.jpg", &width, &height, &components, 3); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img); 
glGenerateMipmap(GL_TEXTURE_2D); 

顶点着色器:

#version 330 
in vec3 pos; 
in vec2 uv; 
out vec2 texcoord; 
void main() { 
    texcoord = uv; 
    gl_Position = vec4(pos, 1.0) 
} 

片段着色器:

#version 330 
in vec2 texcoord; 
out vec4 outColor; 
uniform sampler2D tex; 
void main() { 
    outColor = vec4(texture(tex, texcoord).rgb, 1.0); 
} 

我已经验证了纹理加载,且纹理坐标精细。

编辑:它在RenderDoc中进行调试时工作正常,但当它本身运行时,它不起作用。

+0

尝试outcolor = texture(tex,texcoord); –

+0

你是如何准确检查纹理坐标的? – 246tNt

+0

另外,请把你的顶点着色器。 – 246tNt

回答

0

糟糕!调试时,我忘记了Visual Studio与工作目录的混淆,而stb_image在尝试加载映像时未抛出任何错误。在Visual Studio之外运行它,它工作正常。

0

当使用GL_RGB作为internalFormat,精度留给实现,更好的使用GL_RGBA8

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, img); 

不知道这是你的问题,但值得无论如何mentionning和“意见”是小了点编写代码。

+0

没有帮助,但我保持了改变。 – rytone

相关问题