OpenGL纹理被镜像

问题描述 投票:0回答:1

所以我试图渲染我的纹理,我知道它可以工作,但是当我运行程序时,它会这样渲染:

Mirrored texture

我的设置纹理坐标的代码在这里:

Vertex vertices[] =
{
    //POSITION                      //COLOR                         //Texture Co-ordinates
    glm::vec3(-.5f, .5f, 0.f),      glm::vec3(1.f, 0.f, 0.f),       glm::vec2(0.f, 1.f), // [R]
    glm::vec3(-.5f, -.5f, 0.f),     glm::vec3(0.f, 1.f, 0.f),       glm::vec2(0.f, 0.f), // [G]
    glm::vec3(.5f, -.5f, 0.f),      glm::vec3(0.f, 0.f, 1.f),       glm::vec2(1.f, 0.f), // [B]
    glm::vec3(.5f, .5f, 0.f),       glm::vec3(1.f, 1.f, 0.f),       glm::vec2(1.f, 1.f)  // [Y]

};

这些是我的索引:

GLuint indices[] = 
{ 
    0, 1, 2, // Triagle 1
    0, 2, 3  // Triangle 2
};
unsigned noOfIndices = sizeof(indices) / sizeof(GLuint); // Calculate the number of Indices

我通过头文件调用图像:

// TEXTURE VALUES //
    int imgWidth = 0, imgHeight = 0;

    unsigned char* image = stbi_load("images/letterCube.png", &imgWidth, &imgHeight, NULL, STBI_rgb_alpha);

我在这里生成纹理:

glGenTextures(1, &texture0); // Generate Texture
    glBindTexture(GL_TEXTURE_2D, texture0); // Bind Texture

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // Set Texture Params (Wrap S = X)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Set Texture Params (Wrap T = Y)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); // A type of anti-ailiasing (magnificaiton)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // A type of anti-ailiasing (minificaiton)

    if (image)
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgWidth, imgHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
        glGenerateMipmap(GL_TEXTURE_2D); // Clones image for different resolutions
    }
    else
    {
        GE_CORE_ERROR("Texture loading failed");
    }

    glActiveTexture(0);
    glBindTexture(GL_TEXTURE_2D, 0);
    stbi_image_free(image);

在更新功能中,我激活了我的纹理:

    glUseProgram(core_program);
    glUniform1i(glGetUniformLocation(core_program, "texture0"), 0);
    // ACTIVATE TEXTURE
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, texture0);

在我的fragment_core.glsl文件中,我有这个:

#version 440

in vec3 vs_position;
in vec3 vs_color;
in vec2 vs_texturePoints;

out vec4 fs_color;

uniform sampler2D texture0;
void main()
{
    //fs_color = vec4(vs_color, 1.f);
    fs_color =  texture(texture0, vs_texturePoints) *  vec4(vs_color, 1.f); 
}

我正在尝试正确渲染纹理,但是它看起来像是另一个三角形的镜像。是坐标问题还是我遗漏了明显的问题?

c++ opengl textures
1个回答
0
投票

可以通过更改纹理坐标的v分量(第二个分量)轻松解决此问题:

Vertex vertices[] =
{
    //POSITION                  //COLOR                    //Texture Co-ordinates
    glm::vec3(-.5f,  .5f, 0.f), glm::vec3(1.f, 0.f, 0.f),  glm::vec2(0.f, 0.f), // [R]
    glm::vec3(-.5f, -.5f, 0.f), glm::vec3(0.f, 1.f, 0.f),  glm::vec2(0.f, 1.f), // [G]
    glm::vec3( .5f, -.5f, 0.f), glm::vec3(0.f, 0.f, 1.f),  glm::vec2(1.f, 1.f), // [B]
    glm::vec3( .5f,  .5f, 0.f), glm::vec3(1.f, 1.f, 0.f),  glm::vec2(1.f, 0.f)  // [Y]
};

注意,纹理的左上角是(0,0),但在顶点坐标系中,视图空间y轴指向上方。

© www.soinside.com 2019 - 2024. All rights reserved.