如何正确地制作(繁殖)烟斗?我真的不知道如何正确地制作它,我正在为我的学校项目从头做起,并从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);
}
问题是,当我开始项目时,着色器混淆了,上面的着色器是管道的,下面的是鸟的,这是不正确的,我需要修复什么?
1条答案
按热度按时间bbuxkriu1#
glUniform
*在当前安装的程序的默认统一块中设置统一变量的值。因此,您必须先使用glUseProgram
安装程序,然后才能设置制服。例如: