Цвета текстуры заменены фиолетовыми тонами - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь отобразить текстуру на четырехугольнике, но цвета были заменены фиолетовым. enter image description here

Код создан с сайта «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_image.

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, отображающий проблему. https://bitbucket.org/Neotry/2d-rendering-test./src/master/WIPtest.nim

1 Ответ

0 голосов
/ 14 января 2019

Файл Portable Network Graphics (PNG) может содержать 32-битные цвета RGBA.

Принудительно stbi_load генерирует изображение с 4 цветными каналами, явно передав 4 к последнему параметру:

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

См. stb_image.h :

Basic usage (see HDR discussion below for HDR usage):
      int x,y,n;
      unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
      // ... process data if not NULL ...
      // ... x = width, y = height, n = # 8-bit components per pixel ...

// ... replace '0' with '1'..'4' to force that many components per pixel

      // ... 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_RGB:

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