【问题标题】:Why is my texture loaded into opengl not mapped correctly?为什么我的纹理加载到 opengl 中没有正确映射?
【发布时间】:2018-04-23 14:46:35
【问题描述】:

我正在尝试在 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;
    }   
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    很可能,您的角色已使用 DirectX 约定进行纹理建模。在 DirectX 中,纹理坐标原点是图像的左上角,而在 OpenGL 中是左下角。

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

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

    我建议不要将第三个选项用于快速测试以外的任何事情。

    【讨论】:

    • 非常感谢。确实是问题!不过我还有一个问题。如何知道模型是采用 directX 约定还是 openGL 约定,以便正确加载它们的纹理坐标?
    • 这必须事先知道。您无法在运行时合理地确定这一点。
    猜你喜欢
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2011-05-04
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多