我正在尝试在openGL中加载一个简单的模型。目前,我的纹理有问题。纹理确实显示出来,但它搞砸了,它也没有涵盖所有模型(模型的一部分是黑色)。我已经尝试了几件事来确定问题的根源。我传递了一个统一的红色纹理,它正确呈现。我在片段着色器中使用纹理坐标作为R和G值,我得到一个红绿色模型,所以我假设纹理坐标也很好。
The texture is messed up, and part of it is black. This is just a simple minecraft character
the model's texture, which is a png
以下是我创建纹理的方法:
imageData = stbi_load(path.c_str(), &width, &height, &colorFormat, 0);
glGenTextures(1, &texID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
我的片段着色器:
void main(){
vec4 l = normalize(lightSourcePosition - positionEyeCoord);
vec4 normalFrag = normalize(normalEyeCoord);
if (hasTexture == 1){
vec4 textureKD = vec4(texture(textureSampler, texCoord).rgba);
vec4 diffuse = vec4(lightIntensity, 0.0) * textureKD * max(0.0, dot(l, normalFrag));
vec4 ambient = vec4(ambientIntensity, 0.0) * textureKD;
gl_FragColor = ambient + diffuse;
}
else {
vec4 diffuse = vec4(lightIntensity * KD, 0.0) * max(0.0, dot(l, normalFrag));
vec4 ambient = vec4(ambientIntensity * KA, 0.0);
gl_FragColor = ambient + diffuse;
}
}
答案 0 :(得分:1)
最有可能的是,您的角色已使用DirectX约定进行纹理建模。在DirectX中,纹理坐标原点是图像的左上角,而它是OpenGL的左下角。
你可以做几件事(选择一件):
(u, v)
替换为(u, 1 - v)
。vec2(texCoord.x, 1 - texCoord.y)
作为纹理坐标。我建议不要使用第三个选项进行快速测试以外的任何操作。