feat(OpenGL): moving color changing rectangle
This commit is contained in:
parent
51b09ffe33
commit
8012d47b28
4 changed files with 35 additions and 89 deletions
|
@ -1,6 +1,7 @@
|
|||
#include "glad/glad.h"
|
||||
#include "shader.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
|
||||
// 三角形顶点
|
||||
float vertices[] = {
|
||||
|
@ -17,33 +18,6 @@ unsigned int indices[] = {
|
|||
1, 2, 3 // 第二个三角形
|
||||
};
|
||||
|
||||
// 顶点着色器源码
|
||||
const char *vertexShaderSource =R"(
|
||||
#version 330 core
|
||||
layout (location = 0) in vec3 aPos;
|
||||
layout (location = 1) in vec3 aColor;
|
||||
|
||||
out vec3 color;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(aPos, 1.0);
|
||||
color = aColor;
|
||||
}
|
||||
)";
|
||||
|
||||
// 片段着色器源码
|
||||
const char *fragmentShaderSource = R"(
|
||||
#version 330 core
|
||||
in vec3 color;
|
||||
out vec4 FragColor;
|
||||
|
||||
void main()
|
||||
{
|
||||
FragColor = vec4(color, 1.0);
|
||||
}
|
||||
)";
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
|
||||
void processInput(GLFWwindow *window);
|
||||
|
||||
|
@ -78,60 +52,8 @@ int main() {
|
|||
// 设置视口
|
||||
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
||||
|
||||
// 创建顶点着色器
|
||||
unsigned int vertexShader;
|
||||
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||
// 将着色器源码附加到着色器对象上
|
||||
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
|
||||
// 编译着色器
|
||||
glCompileShader(vertexShader);
|
||||
// 检查编译是否成功
|
||||
int success;
|
||||
char infoLog[512];
|
||||
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
|
||||
if (!success) {
|
||||
// 获取错误信息
|
||||
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"
|
||||
<< infoLog << std::endl;
|
||||
}
|
||||
|
||||
// 创建片段着色器
|
||||
unsigned int fragmentShader;
|
||||
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
// 将着色器源码附加到着色器对象上
|
||||
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
|
||||
// 编译着色器
|
||||
glCompileShader(fragmentShader);
|
||||
// 检查编译是否成功
|
||||
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
|
||||
if (!success) {
|
||||
// 获取错误信息
|
||||
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"
|
||||
<< infoLog << std::endl;
|
||||
}
|
||||
|
||||
// 创建着色器程序
|
||||
unsigned int shaderProgram;
|
||||
shaderProgram = glCreateProgram();
|
||||
// 将着色器附加到程序上
|
||||
glAttachShader(shaderProgram, vertexShader);
|
||||
glAttachShader(shaderProgram, fragmentShader);
|
||||
// 链接程序
|
||||
glLinkProgram(shaderProgram);
|
||||
// 检查链接是否成功
|
||||
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
|
||||
if (!success) {
|
||||
// 获取错误信息
|
||||
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::PROGRAM::LINK_FAILED\n"
|
||||
<< infoLog << std::endl;
|
||||
}
|
||||
|
||||
// 删除着色器
|
||||
glDeleteShader(vertexShader);
|
||||
glDeleteShader(fragmentShader);
|
||||
Shader shader = Shader("src/simple.vs", "src/uniformcolor.fs");
|
||||
|
||||
|
||||
unsigned int VAO, VBO, EBO;
|
||||
|
@ -163,14 +85,19 @@ int main() {
|
|||
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
// 绘制三角形, 激活程序
|
||||
glUseProgram(shaderProgram);
|
||||
// 激活着色器
|
||||
shader.use();
|
||||
|
||||
// 更新uniform颜色
|
||||
float timeValue = glfwGetTime();
|
||||
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
|
||||
shader.setFloat4("ourColor", 1.0f, greenValue, 0.0f, 0.0f);
|
||||
shader.setFloat1("xOffset", cos(timeValue) / 2.0f);
|
||||
shader.setFloat1("yOffset", sin(timeValue) / 2.0f);
|
||||
|
||||
// 绘制三角形
|
||||
glBindVertexArray(VAO);
|
||||
//使用线框模式绘制
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
// 设置线宽
|
||||
glLineWidth(3.0f);
|
||||
// 绘制
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
|
||||
glBindVertexArray(0);
|
||||
|
||||
|
|
8
OpenGL/hello/src/simple.vs
Normal file
8
OpenGL/hello/src/simple.vs
Normal file
|
@ -0,0 +1,8 @@
|
|||
#version 330 core
|
||||
layout(location = 0) in vec3 aPos; // 位置变量的属性位置值为0
|
||||
uniform float xOffset;
|
||||
uniform float yOffset;
|
||||
void main() {
|
||||
gl_Position = vec4(aPos.x + xOffset, aPos.y + yOffset, aPos.z,
|
||||
1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数
|
||||
}
|
2
OpenGL/hello/src/stb.cpp
Normal file
2
OpenGL/hello/src/stb.cpp
Normal file
|
@ -0,0 +1,2 @@
|
|||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
9
OpenGL/hello/src/uniformcolor.fs
Normal file
9
OpenGL/hello/src/uniformcolor.fs
Normal file
|
@ -0,0 +1,9 @@
|
|||
#version 330 core
|
||||
out vec4 FragColor;
|
||||
|
||||
uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量
|
||||
|
||||
void main()
|
||||
{
|
||||
FragColor = ourColor;
|
||||
}
|
Reference in a new issue