Opengl 纹理颜色被紫色色调取代

Opengl 纹理颜色被紫色色调取代,opengl,nim-lang,Opengl,Nim Lang,我试图在四边形上显示纹理,但颜色被一些紫色所取代。 代码的灵感来自“learnopengl”网站,但我没有找到我失败的地方。 这里是着色器 vertSrc:cstring = """ #version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoord; out vec2 texCoord; uniform mat4 projecti

我试图在四边形上显示纹理,但颜色被一些紫色所取代。

代码的灵感来自“learnopengl”网站,但我没有找到我失败的地方。 这里是着色器

vertSrc:cstring = """
    #version 330 core

    layout (location = 0) in vec3 aPos;
    layout (location = 1) in vec2 aTexCoord;

    out vec2 texCoord;
    uniform mat4 projection;

    void main()
    {
        gl_Position = projection * vec4(aPos, 1.0f);
        texCoord = aTexCoord;
    }
    """
fragSrc:cstring = """
    #version 330 core

    out vec4 FragColor;
    in vec2 texCoord;

    uniform sampler2D matTexture;

    void main()
    {
        FragColor = texture(matTexture, texCoord);
    }

    """
纹理的opengl代码

glGenTextures(1, addr textureID)
glBindTexture(GL_TEXTURE_2D, textureID)
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, texWidth, texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, addr imageData[0])
glGenerateMipmap(GL_TEXTURE_2D)
图像加载得益于stb_图像库

var 
textureID:OGLuint
texWidth:OGLint
texHeight:OGLint
channelCount:OGLint
imageData = stbi_load("Test/2d-rendering-test./stack.png", addr texWidth, addr texHeight, addr channelCount, 0)
以及主循环中的opengl代码

glBindTexture(GL_TEXTURE_2D, textureID)
如果您好奇,这里有一个完整的nim文件,显示问题。

该文件可能包含32位RGBA颜色

通过显式地将4传递给最后一个参数,强制
stbi_load
生成具有4个颜色通道的图像:

imageData = stbi_load("Test/2d-rendering-test./stack.png",
                      addr texWidth, addr texHeight, addr channelCount, 4)
见:

/。。。将“0”替换为“1”…“4”,以强制每个像素包含这么多组件

      // ... but 'n' will always be the number that it would have been if you said 0
      stbi_image_free(data)
最后,
glTexImage2D
的格式参数必须是
GL_RGBA
GL_BGRA
。对于内部格式,可以保留
GL\u RGB

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth, texHeight, 0, GL_RGBA,
             GL_UNSIGNED_BYTE, addr imageData[0])  

为什么您要从
stbi\u load()
抓取
channelCount
,然后在
glTexImage2D()
调用中忽略该信息,以支持假设
imageData
始终是
GL\u RGB
?您确定
imageData
不是
GL\u BGR
?@genpfault stbi\u加载函数需要整数地址。channelCount值为3。我试过GL_BGR,但这会导致其他花哨的颜色。@Ploumploum PNG文件有4个通道。尝试显式读取4个通道:
stbi\u load(“…”,addr texWidth,addr texHeight,addr channelCount,4)
。纹理的内部格式最终是
GL_RGBA
,格式可能是
GL_RGBA
GL_BGRA
@rabbi76“内部格式”参数对该图像没有影响,但“格式”解决了问题(与最后一个stbi_加载参数一起)。你可以把你的评论作为回答。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texWidth, texHeight, 0, GL_RGBA,
             GL_UNSIGNED_BYTE, addr imageData[0])