当我尝试在OpenGL中加载纹理时,出现随机颜色

tpgth1q7  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(146)

当我尝试加载一个16x16的PNG作为纹理安装的纹理时,我得到了一个看起来随机的颜色。颜色总是浅蓝色、深蓝色、红色、粉红色。

以下是纹理,如果它有助于DirtTexture

以下是纹理类的代码

TextureClass::TextureClass(const std::string& path)
{

    int w, h, bpp;
    stbi_set_flip_vertically_on_load(1);
    unsigned char* data = stbi_load(path.c_str(), &w, &h, &bpp, 0);
    glGenTextures(1, &ID);
    glBindTexture(GL_TEXTURE_2D, ID);
    glEnable(GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);
    glGenerateMipmap(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0);

    if (data)
    {
        stbi_image_free(data);
    }

}

void TextureClass::Bind(unsigned int slot) const
{
    glActiveTexture(GL_TEXTURE0 + slot);
    glBindTexture(GL_TEXTURE_2D, ID);
}

void TextureClass::Delete()
{
    glDeleteTextures(1, &ID);
}

以下是我的顶点和片段着色器的代码


# shader vertex

# version 330 core

layout (location = 0) in vec2 aPosition;
layout (location = 1) in vec2 aTexCoord;

out vec2 texCoord;
out vec3 color;
void main()
{
    gl_Position = vec4(aPosition.x, aPosition.y, 1.0, 1.0);
    texCoord = aTexCoord;
    color = vec3(1.0, 0.0, 1.0);
};

# shader fragment

# version 330 core

out vec4 FragColor;

in vec2 texCoord;

uniform sampler2D tex0;

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

以下是我的主要部分


# include<glad/glad.h>

# include<GLFW/glfw3.h>

# include <iostream>

# include <fstream>

# include <string>

# include "VAO.h"

# include "VBO.h"

# include "IBO.h"

# include "ShaderClass.h"

# include "Texture.h"

struct ShaderProgramSource
{
    std::string VertexSource;
    std::string FragmentSource;
};

static ShaderProgramSource ParseShader(const std::string& filepath)
{
    std::ifstream stream(filepath);

    enum class ShaderType
    {
        NONE = -1, VERTEX = 0, FRAGMENT = 1
    };

    std::string line;
    std::stringstream ss[2];
    ShaderType type = ShaderType::NONE;
    while (getline(stream, line))
    {
        if (line.find("#shader") != std::string::npos)
        {
            if (line.find("vertex") != std::string::npos)
                type = ShaderType::VERTEX;
            else if (line.find("fragment") != std::string::npos)
                type = ShaderType::FRAGMENT;
        }
        else
        {
            ss[(int)type] << line << 'n';
        }

    }

    return{ ss[0].str(), ss[1].str() };
}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow(800, 800, "pp", NULL, NULL);

    if (window == NULL)
    {
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
    gladLoadGL();
    glViewport(0, 0, 800, 800);

    GLfloat vertices[] =
    {
        -0.5f, -0.5f,   0.0f, 0.0f,//unten Links
        0.5f, -0.5f,    1.0f, 0.0f,//untenRechts
        0.5f, 0.5f,     1.0f, 1.0f,//open Rechts
        -0.5f, 0.5f,    0.0f, 1.0f,//open links
    };

    unsigned int indices[] =
    {
        0,1,2,
        2,3,0,
    };

    ShaderProgramSource source = ParseShader("Basic.shader");
    const char* vertexShader = source.VertexSource.c_str();
    const char* fragmentShader = source.FragmentSource.c_str();
    Shader ShaderProgramm(vertexShader, fragmentShader);
    TextureClass DirtTexture("Dirt.png");
    DirtTexture.Bind(0);
    int Loc1 = ShaderProgramm.GetUniformId("tex0");
    glUniform1i(Loc1, 0);

    VAO vao;
    VBO vbo(vertices, sizeof(vertices));
    IBO ibo(indices, sizeof(indices));
    vbo.Bind();
    vao.Bind();
    ibo.Bind();

    glEnableVertexAttribArray(0);
    vao.LinkAttrib(vbo, 0, 2, GL_FLOAT, 4 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(1);
    vao.LinkAttrib(vbo, 1, 2, GL_FLOAT, 4 * sizeof(float), (void*)1);

    //Main Loop
    while (!glfwWindowShouldClose(window))
    {

        glClear(GL_COLOR_BUFFER_BIT);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
        glUniform1i(Loc1, 0);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    DirtTexture.Delete();
    ShaderProgramm.Delete();
    vbo.Delete();
    vao.Delete();
    ibo.Delete();

    glfwDestroyWindow(window);
    glfwTerminate();
    return 0;
}

这是我的Vao班级


# pragma once

# include<glad/glad.h>

# include "VAO.h"

VAO::VAO()
{
    glGenVertexArrays(1, &ID);
    glBindVertexArray(ID);
}

void VAO::enable()
{
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
}

void VAO::LinkAttrib(VBO& VBO, GLuint layout, GLuint numComponents, GLenum type, GLsizeiptr stride, void* offset)
{
    VBO.Bind();
    glVertexAttribPointer(layout, numComponents, type, GL_FALSE, stride, offset);
    glEnableVertexAttribArray(layout);
    VBO.Unbind();
}

void VAO::Bind()
{
    glBindVertexArray(ID);
}

void VAO::Delete() 
{
    glDeleteVertexArrays(1, &ID);
}
5lhxktic

5lhxktic1#

目前还不清楚您的Vao类在内部是如何工作的,但这看起来确实有问题:

vao.LinkAttrib(vbo, 1, 2, GL_FLOAT, 4 * sizeof(float), (void*)1);

glVertexAttribPointer使用偏移*,单位为字节*,因此与顶点数据匹配的正确偏移是2*sizeof(GLfloat),而不是1

相关问题