繁体   English   中英

OpenGL 在使用 sampler2D 时显示条纹

[英]OpenGL showing stripes when using sampler2D

尝试在 C++ 中编写 OpenGL 应用程序时遇到了一个奇怪的问题。 减少代码后,我发现问题出在纹理采样上。 在纹理之上有奇怪的条纹: 条纹错误

应该绘制的是具有此纹理的矩形: 在此处输入图像描述

奇怪的是,当我调整 window 的大小时,条纹的粗细也发生了变化: 在此处输入图像描述

我不认为着色器有什么问题,但它们是:

//-----------------Vertex-----------------
#version 330 core

layout (location = 0) in vec3 pos_;
layout (location = 1) in vec3 color_;
layout (location = 2) in vec2 uv_;

out vec2 uv;

void main()
{
    uv = uv_;
    gl_Position = vec4(pos_, 1.0);
}
//-----------------Fragment---------------
#version 330 core

out vec4 frag_color;

in vec2 uv;

uniform sampler2D diffuse_;

void main()
{
    frag_color = texture(diffuse_, uv);
}

我也认为这可能不是纹理加载问题的原因,但不管它是:

GLuint load_texture(const std::string& source)
{
    GLuint texture = 0;

    int width, height, nrChannels;
    unsigned char* data = stbi_load(source.c_str(), &width, &height, &nrChannels, 0);
    if (data != nullptr)
    {
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);

        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);

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
    {
        std::cerr << "Failed to load texture" << std::endl;
    }
    stbi_image_free(data);

    return texture;
}

另外,如果有帮助,这里我提供分配顶点属性的代码:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(0 * sizeof(GLfloat)));
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (void*)(6 * sizeof(GLfloat)));
glEnableVertexAttribArray(2);

并设置纹理统一:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, diffuse);

glUseProgram(shader);
glUniform1i(glGetUniformLocation(shader, "diffuse_"), 0);

对不起,如果那是很多代码,但我不知道问题出在哪里。 你们有没有人以前见过这样的事情并且知道如何解决这个问题?

感谢@Botje,问题得以解决。 使用glTexImage2D给OpenGL的通道数量不等于nrChannels 我可以通过在load_texture内进行简单的switch来解决此load_texture 这是更新的版本:

GLuint load_texture(const std::string& source)
{
    GLuint texture = 0;

    int width, height, nrChannels;
    unsigned char* data = stbi_load(source.c_str(), &width, &height, &nrChannels, 0);
    if (data != nullptr)
    {
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);

        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);

        GLenum format;
        switch (nrChannels)
        {
        case 1:
            format = GL_LUMINANCE;
            break;
        case 2:
            format = GL_LUMINANCE_ALPHA;
            break;
        case 3:
            format = GL_RGB;
            break;
        case 4:
            format = GL_RGBA;
            break;
        }

        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
    {
        std::cerr << "Failed to load texture" << std::endl;
    }
    stbi_image_free(data);

    return texture;
}

加载 jpg 图像时我遇到了同样的问题。设置 GL_UNPACK_ALIGNMENT 修复了它。 https://github.com/nothings/stb/issues/695

    if (channels == 3) {
        //HERE WAS THE MISTAKE
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM