如何使用计时器移动顶点着色器中的点

2024-03-24

我无法弄清楚如何使用顶点着色器通过计时器为我的对象设置动画。我在窗口中的随机位置有一堆点。我想要做的是将这些点移动到窗口的中心(即 {0.0,0.0}),然后在某个点到达窗口中心后停止在那里。这是我的顶点着色器代码:

layout(location = 0) in vec2 vertexPos;

uniform mat4 P;
uniform mat4 MV;
uniform float time;

void main() {
    gl_Position = P * MV * vec4(vertexPos, 0.0, 1.0);
}

这显示了随机位置的所有点。我知道如何将它们移动到中心,但我不知道如何显示实际移动到中心的点。


Use mix() https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/mix.xhtml to lerp https://en.wikipedia.org/wiki/Linear_interpolation粒子的初始位置和原点之间:

layout(location = 0) in vec2 vertexPos;

uniform mat4 P;
uniform mat4 MV;
uniform float time;

void main()
{
    vec2 dest( 0.0, 0.0 );
    vec2 curPos = mix( vertexPos, dest, time );
    gl_Position = P * MV * vec4( curPos, 0.0, 1.0 );
}

Vary time from 0.0 to 1.0在基于主机计时器的主机代码中。

EDIT: 全部一起:

#include <GL/glew.h>
#include <GL/freeglut.h>
#include <iostream>
#include <cstdarg>
#include <vector>
using namespace std;

struct Program
{
    static GLuint Load( const char* shader, ... )
    {
        GLuint prog = glCreateProgram();
        va_list args;
        va_start( args, shader );
        while( shader )
        {
            const GLenum type = va_arg( args, GLenum );
            AttachShader( prog, type, shader );
            shader = va_arg( args, const char* );
        }
        va_end( args );
        glLinkProgram( prog );
        CheckStatus( prog );
        return prog;
    }

private:
    static void CheckStatus( GLuint obj )
    {
        GLint status = GL_FALSE;
        if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
        if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
        if( status == GL_TRUE ) return;
        GLchar log[ 1 << 15 ] = { 0 };
        if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
        if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
        std::cerr << log << std::endl;
        exit( EXIT_FAILURE );
    }

    static void AttachShader( GLuint program, GLenum type, const char* src )
    {
        GLuint shader = glCreateShader( type );
        glShaderSource( shader, 1, &src, NULL );
        glCompileShader( shader );
        CheckStatus( shader );
        glAttachShader( program, shader );
        glDeleteShader( shader );
    }
};

#define GLSL(version, shader) "#version " #version "\n" #shader

const char* vert = GLSL
(
    330 core,
    layout( location = 0 ) in vec2 vertexPos;
    uniform float time;
    void main()
    {
        vec2 dest = vec2( 0.0, 0.0 );
        vec2 curPos = mix( vertexPos, dest, time );
        gl_Position = vec4( curPos, 0.0, 1.0 );
    }
);

const char* frag = GLSL
(
    330 core,
    out vec4 color;
    void main()
    {
        color = vec4( 1.0, 1.0, 1.0, 1.0 );
    }
);

float rnd( const float lo, const float hi )
{
    return lo + ( hi - lo ) * ( rand() / (float)RAND_MAX );
}

GLuint prog = 0;
GLint timeLoc = -1;
void init()
{
    GLuint vao = 0;
    glGenVertexArrays( 1, &vao );
    glBindVertexArray( vao );

    std::vector< float > verts;
    for( size_t i = 0; i < 100; ++i )
    {
        verts.push_back( rnd( -1, 1 ) );
        verts.push_back( rnd( -1, 1 ) );
    }

    GLuint vbo = 0;
    glGenBuffers( 1, &vbo );
    glBindBuffer( GL_ARRAY_BUFFER, vbo );
    glBufferData( GL_ARRAY_BUFFER, sizeof( float ) * verts.size(), &verts[0], GL_STATIC_DRAW );

    glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, 0 );
    glEnableVertexAttribArray( 0 );

    prog = Program::Load
        (
        vert, GL_VERTEX_SHADER,
        frag, GL_FRAGMENT_SHADER,
        NULL
        );
    glUseProgram( prog );
    timeLoc = glGetUniformLocation( prog, "time" );
}

float u = 0.0f;
void timer( int value )
{
    const int duration = 3000;
    static int startTime = glutGet( GLUT_ELAPSED_TIME );
    const int curTime = glutGet( GLUT_ELAPSED_TIME );

    if( curTime > startTime + duration )
    {
        startTime = curTime;
    }

    u  = ( curTime - startTime ) / (float)duration;

    glutTimerFunc( 16, timer, 0 );
    glutPostRedisplay();
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT );
    glUniform1f( timeLoc, u );
    glDrawArrays( GL_POINTS, 0, 100 );
    glutSwapBuffers();
}

int main(int argc, char **argv)
{
    glutInit( &argc, argv );
    glutInitContextVersion( 3, 3 );
    glutInitContextProfile( GLUT_CORE_PROFILE );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 600, 600 );
    glutCreateWindow( "GLUT" );

    glewExperimental = GL_TRUE;
    glewInit();

    init();

    glutDisplayFunc( display );
    glutTimerFunc( 0, timer, 0 );
    glutMainLoop();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用计时器移动顶点着色器中的点 的相关文章

  • OpenGL 超级采样抗锯齿?

    在办公室 我们正在使用旧的 GLX Motif 软件 该软件使用 OpenGL 的 AccumulationBuffer 来实现保存图像的抗锯齿功能 我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer 从OS
  • 着色器/矩阵问题 - 看不到对象

    我试图在屏幕上放置一个立方体并点亮它 我想要在立方体上添加 phong 阴影 当我运行代码时 我可以看到背景图像 但看不到立方体 我相当确定立方体本身是正确的 因为我已经设法用纯色着色器显示它 我已经设法编译着色器程序 但我根本看不到立方体
  • libgdx 中帧缓冲区的结果不明确

    我得到以下奇怪的结果帧缓冲区 http libgdx badlogicgames com nightlies docs api com badlogic gdx graphics glutils FrameBuffer htmllibgdx
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • 将glm四元数转换为旋转矩阵并与opengl一起使用

    所以我将对象的方向存储在 glm fquat 中 我想用它来旋转我的模型 我怎么做 我试过这个 glPushMatrix glTranslatef position x position y position z glMultMatrixf
  • Opengl 非同步/非阻塞地图

    我刚刚找到以下内容OpenGL 规范ARB map buffer range http www opengl org registry specs ARB map buffer range txt 我想知道是否可以使用此扩展进行非阻塞地图调
  • OpenGL 说“from_param 收到了一个不连续的数组”

    安装 Yosemite 后 我必须升级 numpy PyOpenGL 等 现在 以前运行的程序给了我以下堆栈跟踪 file latebind pyx line 44 in OpenGL accelerate latebind Curry c
  • 纹理openGl。 C++、qt

    我试图用草纹理覆盖我的地形 由高度图制成 但它没有按预期工作 我什至无法在简单的 GL QUAD 上获取纹理 结果是多色网络 void GLWidget initializeGL glEnable GL TEXTURE 2D 在 QGLwi
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • 如何将点光源转换为卵形/椭圆形?

    我希望通过具有不同 x 和 y 值的 vec2 半径将当前的圆形光变成椭圆形 有没有办法根据我当前在片段着色器中的代码来做到这一点 uniform struct Light vec4 colour vec3 position vec2 ra
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • OpenGL 与 Eclipse CDT + MinGW + GLEW + GLFW:未定义的参考

    Edit 与此同时 我已经弄清楚了这一点 并在下面写了详细的答案 我刚刚尝试在 Win7 上从 Express 版本的 MSVC 10 切换到 Eclipse CDT 在配置时遇到了以下简单 OpenGL 代码的问题 在 Visual St
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • 如何仅剪切剪切平面的交集(而不是并集)?

    在 OpenGL JOGL 中 当使用多个剪切平面时 似乎会应用所有剪切平面的并集 我想要的是路口要应用的所有剪裁平面 这可能吗 请参阅下面的简化二维示例 Edit An example of clipping by vertex shad
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我

随机推荐

  • 向量化 R 的 dplyr 中每行的“日期范围的扩展”

    我在 R 中的 tibble 中有一个数据集 如下所示 A tibble 50 045 x 5 ref key start date end date
  • 如何使用 Robo 3T 从 MongoDB 导出 JSON

    我正在使用 Robo 3T 以前称为 RoboMongo 我将其连接到 MongoDB 我需要做的是 MongoDB 中有一个集合 我想从该集合中导出数据 以便将其保存到文件中 I used the interface to open th
  • 打印 rdlc 报告而不查看打印对话框

    我正在编写一个 POS 应用程序 需要经常打印发票 我需要将其直接发送到打印机 而不是查看打印对话框 使用 Reportviewer renderingcomplete 我可以避免看到报告 但我不知道如何避免看到打印对话框并在没有用户干预的
  • 如何在异步加载的 HTML 元素之间创建信号量

    我在 HTML 页面中有一个出现多次的元素 并且运行相同的 JS 问题是 我希望它只有在第一个运行它时才执行特定功能 他的兄弟姐妹从未运行过它 我需要信号量在它们之间同步 我无法知道如何在 JS 中声明变量并以这种方式执行信号量 有很多方法
  • Glassfish 中的 JNDI 配置/查找

    我在 Glassfish 中获取一些基本的 JNDI 配置时遇到问题 我认为应该是一个简单的任务 在运行时确定特定属性是否设置为 true 我认为这是 JNDI 的一个很好的应用程序 但似乎无法在应用程序服务器和我的 servlet 代码之
  • 为什么自定义的基于 nib 的表格单元格的 init 方法没有被调用

    我有一个在界面生成器中创建的基于笔尖的表格视图单元 我将表视图单元格的类设置为FooTableViewCell它延伸自UITableViewCell In FooTableViewCell我像这样重写 init 方法 id init if
  • UITableViewRowAction 标题图像

    我做了一个自定义的 UITableViewRowAction 现在我想添加图像而不是文本 我知道这是可能的 但不知道该怎么做 你们中有人知道如何在 Swift 中执行此操作并愿意帮助我吗 感谢您的回答 iOS 11 0 Swift Appl
  • 解释一下c中qsort()函数的类型转换? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 1 在这段代码中pLhs and pRhs指向某个随机内存位置 那么如何将该随机内存位置的内容复制到 LHS 指向的位置 2 解释使用的比较
  • bash 脚本中变量的转义

    我的 bash 脚本使用 printf 编写了另一个 bash 脚本 printf bin bash HOME server file gromacs file name basename file date date m d Y for
  • 伊2。访问更高级别的文件夹

    简单的问题 我用Yii2高级模板 在apache I have DocumentRoot path www yii application1 frontend web 我怎样才能访问 www yii application1 uploads
  • 如何在没有日志、没有信息的情况下调试 Laravel 错误 500

    我正在开发现有的 Laravel 应用程序以开发新功能 但在我的计算机上安装该应用程序后 出现错误 500 并且没有任何线索来解决它 在我的 app php 文件中我设置了 env gt env APP ENV local debug gt
  • 是否建议在一个文件中包含多个类? [复制]

    这个问题在这里已经有答案了 可能的重复 我应该在一个文件中放入多少个 Python 类 https stackoverflow com questions 106896 how many python classes should i pu
  • Rails 3 检查属性是否更改

    在 Rails 3 中更新之前需要检查属性块是否已更改 街道 1 街道 2 城市 州 邮政编码 我知道我可以使用类似的东西 if user street1 params user street1 then do something end
  • R中似乎不存在错误光栅文件

    由于 pgirmess 包出现故障 我重新安装了 R 我已经重新下载了所有必需的软件包 我使用了在重新安装之前运行良好的相同脚本 但是我无法读取光栅对象 并且收到一条消息 Error file exists filename is not
  • 更新未屏蔽的 numpy 数组

    我的问题是双重的 首先 假设我有两个 numpy 数组 它们被部分屏蔽 array old 10 11 12 14 17 array update 5 9 15 8 13 19 16 如何创建一个新数组 其中所有非屏蔽值都被更新或修改 例如
  • Python easygui 无法选择文件

    这是我的代码 import easygui f easygui fileopenbox print f 看起来很简单 但是当我运行它时 我无法选择任何文件 请参见链接中的图 抱歉 如果这很愚蠢 但我已经无计可施了 https i stack
  • 安装国际 PHP 扩展 OSX High Sierra

    如何在 PHP 7 1 7 中安装 intl PHP 扩展 随 osx high Sierra 一起提供 所以我有完全相同的问题 正如其他人在这里评论所指出的 High Sierra 附带安装了 PHP 7 1 并且该 PHP 版本已对其进
  • Flutter TextField 输入验证日期

    我正在尝试编写一个日期输入控件 它接受像 23 12 1997 这样的日期 我希望它做的是自动为用户插入 字符 因此 当他们输入 23 时 监听器返回 23 以便他们可以输入 12 此时 监听器再次添加 让用户通过输入 1997 来完成日期
  • 如何将node.js连接到mysql和wamp/xampp服务器?

    我是一名 PHP 程序员 目前从事 WP CI OC 工作 我是node js的绝对初学者 想知道如何一步步连接MySql和WAMP XAMPP 如果我要直播 那么直播服务器的设置是什么 请让我知道一步一步的方法 按照本教程进行操作 教程在
  • 如何使用计时器移动顶点着色器中的点

    我无法弄清楚如何使用顶点着色器通过计时器为我的对象设置动画 我在窗口中的随机位置有一堆点 我想要做的是将这些点移动到窗口的中心 即 0 0 0 0 然后在某个点到达窗口中心后停止在那里 这是我的顶点着色器代码 layout location