作为项目的一部分;我需要创建一个挥动效果的旗帜,如下所示:
https://i.stack.imgur.com/db5zB.gif
我无法设法添加波浪效果,所以我删除了新月和&明星,现在试图挥动旗帜本身。
我相信当我打发时间时,它不会更新,因此动画不会发生。 到目前为止我所做的是:
#include "Angel.h"
float PI = 3.14;
int verticeNumber = 0;
float time;
struct point {
GLfloat x;
GLfloat y;
};
point vertices[500];
// OpenGL initialization
void init()
{
// Create a vertex array object
vertices[0].x = -0.75;
vertices[0].y = 0.5;
vertices[1].x = 0.75;
vertices[1].y = 0.5;
vertices[2].x = 0.75;
vertices[2].y = -0.5;
vertices[3].x = -0.75;
vertices[3].y = -0.5;
vertices[4].x = -0.75;
vertices[4].y = 0.5;
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Load shaders and use the resulting shader program
time = glutGet(GLUT_ELAPSED_TIME);
GLuint program = InitShader("vshader.glsl", "fshader.glsl");
glUseProgram(program);
// set up vertex arrays
GLuint vPosition = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(vPosition);
glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Paint the background
glClearColor(0.36, 0.74, 0.82, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glutSwapBuffers();
}
void display(void)
{
}
// Ends the program on ESC press.
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 033:
exit(EXIT_SUCCESS);
break;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(800, 800);
// OpenGL Version Check
glutInitContextVersion(3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);
// Name the window
glutCreateWindow("I'm Rick Harrison, and this is my pawn shop");
glewExperimental = GL_TRUE;
glewInit();
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
我的着色器文件是:
#version 430
varying vec4 f_color;
void main(void) {
gl_FragColor = vec4(1,0,0,1);
}
和
#version 430
in vec4 vPosition;
in float time;
void main()
{
vec4 temp = vPosition;
temp.y = cos(0.1*time)*temp.y;
gl_Position = temp;
}
结果如下: https://i.stack.imgur.com/MVSp0.png没有任何动画。
答案 0 :(得分:1)
我没有看到你更新'时间'每一帧。 https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/uniform.php
显示功能内部为空,因此您不会在“初始化”后重新绘制图像。因此,即使调整时间本身也无法解决这个问题。您应该在显示功能中执行所有实际的绘图/切换缓冲区。
同样这样做会上下移动整个项目。你应该有cos(速度*(时间+偏移)),其中偏移量是根据与旗帜底部的距离计算的。你可能需要更多的顶点才能让动画变得流畅,所以即使你让它变得有效也看起来很奇怪。
有很多问题,但这应该让你朝着正确的方向前进。
答案 1 :(得分:1)
需要更新user2927848提及的时间。我只是想告诉你的挥动效果。如果你想在顶点着色器中传递时间,你需要自己生成四个以上的顶点,因为你的顶点着色器只能被pipleline调用4次 ,每个顶点之一。所以你不会得到你期望的美丽波浪效果。
总之,你的国旗挥舞顺利有两种方式。
在第一个建议中,您需要生成可能 100 * 50个顶点以使其平滑,或者根据您的喜好更好地看起来更好。
第二个建议也有一个问题,如果你的图像完全适合你的飞机,那么你需要以某种方式让图像远离边界。解决这个问题的简单方法是让你的* .png图像在边框处有一些透明度边距,并在uv值处做任何挥动函数。
我只是在shadertoy中实现最简单的挥动效果。 还把下面的代码,因为它很短......
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 uv = fragCoord.xy / iResolution.xy;
uv.y = uv.y + 0.1 * sin(iGlobalTime + 10.0 * uv.x);
vec4 textureColor = texture2D(iChannel0, uv);
fragColor = textureColor;
}