为什么我的纹理加载到OpenGL中,未正确映射

Why is my texture loaded into opengl not mapped correctly?

本文关键字:映射 OpenGL 我的 纹理 加载 为什么      更新时间:2023-10-16

我正在尝试在OpenGL中加载一个简单的模型。目前,我对纹理有问题。质地确实显示出来,但是它弄乱了,也没有涵盖所有模型(模型的一部分是黑色(。我尝试了几件事来确定问题的根源。我以统一的红色纹理传递,并正确地呈现。我将纹理坐标用作片段着色器中的R和G值,并且得到了一个红绿色的模型,因此我认为纹理坐标也很好。

质地弄乱了,部分是黑色的。这只是一个简单的Minecraft字符

模型的纹理,即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;
    }   
}

很可能,您的角色是使用DirectX约定进行纹理建模的。在DirectX中,纹理坐标来源是图像的左上角,而它是OpenGl中的左下角。

您可以做几件事(选择一个(:

  • 加载模型时,将所有纹理坐在(u, v)中替换CC_1。
  • 加载纹理时,垂直翻转图像
  • 在您的着色器中,将vec2(texCoord.x, 1 - texCoord.y)用于纹理坐标。

我建议不要对快速测试以外的任何其他选项使用第三个选项。