如何在飞禽克隆中正确制作管子

svmlkihl  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(108)

如何正确地制作(繁殖)烟斗?我真的不知道如何正确地制作它,我正在为我的学校项目从头做起,并从learopengl.com指导,我有一个想法只是做6个管子,3个上管和3个下管,做一个由它们组成的3个数组(1个上管和1个下管),当其中一个数组命中角落(左)时,将xOffset移回乞讨(右角)如果你知道如何以任何方式使它变得更好,而不仅仅是管道,我很高兴阅读并为你的版本重新制作项目
所以我在这里做一只“鸟”:

Shader ourShader("Game/shaders/3.3.shader.vs", "Game/shaders/3.3.shader.fs");

float vertices[] = {
         0.5f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f, 
         0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f, 
        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f, 
        -0.5f,  0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f  
};
unsigned int indices[] = {
        0, 1, 3,
        1, 2, 3
};

unsigned int VBO[2], VAO[2], EBO[2];
    glGenVertexArrays(2, VAO);
    glGenBuffers(2, VBO);
    glGenBuffers(2, EBO);

    glBindVertexArray(VAO[0]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[0]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
    glEnableVertexAttribArray(2);

    unsigned int texture;
    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_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    int width, height, nrChannels;
    unsigned char* data = stbi_load("Game/container.jpg", &width, &height, &nrChannels, 0);
    if (data)
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);
    }
    else
    {
        std::cout << "Failed to load texture" << std::endl;
    }
    stbi_image_free(data);

glm::mat4 trans = glm::mat4(1.0f);
        trans = glm::scale(trans, glm::vec3(.1, .1, .1));
        unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
        glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));

        ourShader.use();
        glBindTexture(GL_TEXTURE_2D, texture);
        glBindVertexArray(VAO[1]);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

和管道(上部):

Shader pipe1("Game/shaders/pipe1.vs", "Game/shaders/pipe1.fs"); 
float pipes[] = {
         1.0f,  1.0f, 0.0f,   0.0f, 1.0f, 0.0f,    
         1.0f,  0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   
         0.5f, 0.5f, 0.0f,    0.0f, 1.0f, 0.0f,   
         0.5f,  1.0f, 0.0f,   0.0f, 1.0f, 0.0f,   
    };
    unsigned int pipesindices[] = {
        0, 1, 3, 
        1, 2, 3
    };
glBindVertexArray(VAO[1]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(pipes), pipes, GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(pipesindices), pipesindices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
    glEnableVertexAttribArray(1);
    glm::mat4 trans2 = glm::mat4(1.0f);

    trans2 = glm::scale(trans2, glm::vec3(1, 1, 1));
    unsigned int transformLoc2 = glGetUniformLocation(pipe1.ID, "transform");
    glUniformMatrix4fv(transformLoc2, 1, GL_FALSE, glm::value_ptr(trans2));
    pipe1.use();
    glBindVertexArray(VAO[0]);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

鸟着色器文件:


# version 330 core

out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

// texture sampler
uniform sampler2D ourTexture;

void main()
{
    FragColor = texture(ourTexture, TexCoord) * vec4(ourColor, 1.0);  
}
------

# version 330 core

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

out vec3 ourColor;
out vec2 TexCoord;
uniform float xOffset;
uniform float yOffset;
uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos.x + xOffset, aPos.y + yOffset, aPos.z, 1.0);
    ourColor = aColor;
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

管道着色器文件:


# version 330 core

out vec4 FragColor;

in vec3 ourColor;
in vec2 TexCoord;

// texture sampler
uniform sampler2D ourTexture;

void main()
{
    FragColor = texture(ourTexture, TexCoord) * vec4(ourColor, 1.0);  
}
---

# version 330 core

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

out vec3 ourColor;
out vec2 TexCoord;
uniform float xOffset;
uniform float yOffset;
uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(aPos.x + xOffset, aPos.y + yOffset, aPos.z, 1.0);
    ourColor = aColor;
    TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}

问题是,当我开始项目时,着色器混淆了,上面的着色器是管道的,下面的是鸟的,这是不正确的,我需要修复什么?

bbuxkriu

bbuxkriu1#

glUniform *在当前安装的程序的默认统一块中设置统一变量的值。因此,您必须先使用glUseProgram安装程序,然后才能设置制服。例如:

ourShader.use();
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
pipe1.use();
glUniformMatrix4fv(transformLoc2, 1, GL_FALSE, glm::value_ptr(trans2));

相关问题