feat(OpenGL-hello): tex v2
This commit is contained in:
parent
7a290b9734
commit
10e78fa03f
3 changed files with 68 additions and 32 deletions
BIN
OpenGL/hello/resources/awesomeface.png
Normal file
BIN
OpenGL/hello/resources/awesomeface.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
|
@ -57,31 +57,6 @@ int main() {
|
||||||
// 创建着色器程序
|
// 创建着色器程序
|
||||||
Shader shader = Shader("src/tex.vs", "src/tex.fs");
|
Shader shader = Shader("src/tex.vs", "src/tex.fs");
|
||||||
|
|
||||||
// 创建纹理
|
|
||||||
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("resources/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);
|
|
||||||
|
|
||||||
unsigned int VAO, VBO, EBO;
|
unsigned int VAO, VBO, EBO;
|
||||||
// 创建顶点数组对象
|
// 创建顶点数组对象
|
||||||
glGenVertexArrays(1, &VAO);
|
glGenVertexArrays(1, &VAO);
|
||||||
|
@ -110,6 +85,66 @@ int main() {
|
||||||
(void *)(6 * sizeof(float)));
|
(void *)(6 * sizeof(float)));
|
||||||
glEnableVertexAttribArray(2);
|
glEnableVertexAttribArray(2);
|
||||||
|
|
||||||
|
// 创建纹理
|
||||||
|
unsigned int texture1, texture2;
|
||||||
|
glGenTextures(1, &texture1);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture1);
|
||||||
|
// 设置纹理环绕方式
|
||||||
|
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;
|
||||||
|
// 图片翻转y轴
|
||||||
|
stbi_set_flip_vertically_on_load(true);
|
||||||
|
unsigned char *data =
|
||||||
|
stbi_load("resources/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);
|
||||||
|
|
||||||
|
glGenTextures(1, &texture2);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture2);
|
||||||
|
// 设置纹理环绕方式
|
||||||
|
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);
|
||||||
|
|
||||||
|
// 加载并生成纹理
|
||||||
|
// 图片翻转y轴
|
||||||
|
stbi_set_flip_vertically_on_load(true);
|
||||||
|
data =
|
||||||
|
stbi_load("resources/awesomeface.png", &width, &height, &nrChannels, 0);
|
||||||
|
if (data) {
|
||||||
|
|
||||||
|
// note that the awesomeface.png has transparency and thus an alpha channel,
|
||||||
|
// so make sure to tell OpenGL the data type is of GL_RGBA
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, data);
|
||||||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
} else {
|
||||||
|
std::cout << "Failed to load texture" << std::endl;
|
||||||
|
}
|
||||||
|
stbi_image_free(data);
|
||||||
|
|
||||||
|
// 激活着色器
|
||||||
|
shader.use();
|
||||||
|
// 绑定纹理
|
||||||
|
shader.setInt("texture1", 0);
|
||||||
|
shader.setInt("texture2", 1);
|
||||||
|
|
||||||
// 循环渲染
|
// 循环渲染
|
||||||
while (!glfwWindowShouldClose(window)) {
|
while (!glfwWindowShouldClose(window)) {
|
||||||
// 处理输入
|
// 处理输入
|
||||||
|
@ -120,15 +155,15 @@ int main() {
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
// 绑定纹理
|
// 绑定纹理
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture1);
|
||||||
// 激活着色器
|
glActiveTexture(GL_TEXTURE1);
|
||||||
shader.use();
|
glBindTexture(GL_TEXTURE_2D, texture2);
|
||||||
|
|
||||||
// 绘制三角形
|
// 绘制三角形
|
||||||
|
shader.use();
|
||||||
glBindVertexArray(VAO);
|
glBindVertexArray(VAO);
|
||||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||||
glBindVertexArray(0);
|
|
||||||
|
|
||||||
// 检查并调用事件,交换缓冲
|
// 检查并调用事件,交换缓冲
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
|
|
|
@ -4,9 +4,10 @@ out vec4 FragColor;
|
||||||
in vec3 ourColor;
|
in vec3 ourColor;
|
||||||
in vec2 TexCoord;
|
in vec2 TexCoord;
|
||||||
|
|
||||||
uniform sampler2D ourTexture;
|
uniform sampler2D texture1;
|
||||||
|
uniform sampler2D texture2;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
FragColor = texture(ourTexture, TexCoord) * vec4(ourColor, 1.0);;
|
FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2);
|
||||||
}
|
}
|
Reference in a new issue