Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在OpenGL中显示纹理_Opengl_Textures - Fatal编程技术网

无法在OpenGL中显示纹理

无法在OpenGL中显示纹理,opengl,textures,Opengl,Textures,因此,我在OpenGL中将纹理应用于网格时遇到了一些问题。我到处寻找解决方案,但在许多小时的研究中都没有找到解决方案 我希望另一双眼睛能够捕捉到我代码中的错误 当我在着色器中设置颜色时,一切都很好,但如果我尝试向其传递纹理,则 完全不可见的网格,如果加载的图像具有透明度或 一个颜色均匀的网格,似乎是我的图像中实际颜色的混合(在没有透明度的图像中) 下面的代码绘制一个简单的正方形,并(应该)对其应用纹理 图像加载器: void Texture::loadTexture(const char*

因此,我在OpenGL中将纹理应用于网格时遇到了一些问题。我到处寻找解决方案,但在许多小时的研究中都没有找到解决方案

我希望另一双眼睛能够捕捉到我代码中的错误

当我在着色器中设置颜色时,一切都很好,但如果我尝试向其传递纹理,则

  • 完全不可见的网格,如果加载的图像具有透明度或
  • 一个颜色均匀的网格,似乎是我的图像中实际颜色的混合(在没有透明度的图像中)
下面的代码绘制一个简单的正方形,并(应该)对其应用纹理

图像加载器:

void Texture::loadTexture(const char* _filename)
{
    char fn[255] = "assets/textures/";
    strcat(fn, _filename);

    std::cout << fn << std::endl;

    FREE_IMAGE_FORMAT format = FreeImage_GetFileType(fn, 0);
    FIBITMAP* bitmap = FreeImage_Load(format, fn);
    FIBITMAP* bitmap32 = nullptr;

    unsigned int bitsPerPixel =  FreeImage_GetBPP(bitmap);
    std::cout << "Image BPP: " << bitsPerPixel << std::endl;

    int imageWidth  = FreeImage_GetWidth(bitmap);
    int imageHeight = FreeImage_GetHeight(bitmap);
    std::cout << "Image size: " << imageWidth << " x " << imageHeight << std::endl;

    if (bitsPerPixel != 32)
        bitmap32 = FreeImage_ConvertTo32Bits(bitmap);
    else
        bitmap32 = bitmap;

    BYTE* textureData = FreeImage_GetBits(bitmap32);

    //for(int i = 0; i < imageWidth * imageHeight * 4; i += 4) {
    //   std::cout << (int)textureData[i] << ", " << (int)textureData[i+1] << ", " << (int)textureData[i+2] << ", " << (int)textureData[i+3] << std::endl;
    //}

    glBindTexture(GL_TEXTURE_2D, m_ID);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageWidth, imageHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)textureData);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    FreeImage_Unload(bitmap);

    if (bitsPerPixel != 32)
        FreeImage_Unload(bitmap32);

}

作为补充信息,在初始化过程中设置/启用以下OpenGL参数:

void Window::init()
{
    // Set viewport size
    glfwGetFramebufferSize(m_Window, &m_Width, &m_Height);
    glViewport(0, 0, m_Width, m_Height);

    // Set vsync
    glfwSwapInterval(0);

    // Set face culling and depth test.
    glFrontFace(GL_CW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);

    // Enable 2D textures
    glEnable(GL_TEXTURE_2D);

    // Enable gamma correction
    glEnable(GL_FRAMEBUFFER_SRGB);
}
任何帮助都将不胜感激


谢谢大家!

我发现了我的问题。这表明长时间盯着自己的代码会让你错过最明显的事情

问题出在我的着色器中。顶点着色器正在输出

vec2 coords
但是片段着色器正在等待

vec2 coord
一旦我将变量名更改为匹配,我就得到了我的纹理

#version 330 core

in vec2 coord;

uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, coord.xy);//vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
void Window::init()
{
    // Set viewport size
    glfwGetFramebufferSize(m_Window, &m_Width, &m_Height);
    glViewport(0, 0, m_Width, m_Height);

    // Set vsync
    glfwSwapInterval(0);

    // Set face culling and depth test.
    glFrontFace(GL_CW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glEnable(GL_DEPTH_TEST);

    // Enable 2D textures
    glEnable(GL_TEXTURE_2D);

    // Enable gamma correction
    glEnable(GL_FRAMEBUFFER_SRGB);
}
vec2 coords
vec2 coord