OpenGL——场景动画

5 篇文章 0 订阅

画一个运动的三角形,使用了统一变量。
glGetUniformLocation()获取指向变量offset的指针,用glProgramUniform1f()将x的值复制给offset。

代码

顶点着色器代码:

//vertShader.glsl
#version 460

uniform float offset;

void
main (void)
{
	if (gl_VertexID == 0)
		gl_Position = vec4 (0.25 + offset, -0.25, 0.0, 1.0);
	else if (gl_VertexID == 1)
		gl_Position = vec4 (-0.25 + offset, -0.25, 0.0, 1.0);
	else
		gl_Position = vec4 (0.25 + offset, 0.25, 0.0, 1.0);
}

main函数:

#include "Utils.h"

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;

constexpr int numVAOs = 1;

GLuint renderingProgram;
GLuint vao[numVAOs];

GLuint
createShaderProgram ()
{
	Utils::string vShaderString = Utils::readShaderSource ("vertShader.glsl");
	const char *vshaderSource	= vShaderString.c_str();

	const char *fshaderSource = "#version 460 \n"
								"out vec4 color; \n"
								"void main(void) \n"
								"{ color = vec4(0.0, 1.0, 0.0, 1.0); }";

	GLuint vShader = glCreateShader (GL_VERTEX_SHADER);
	GLuint fShader = glCreateShader (GL_FRAGMENT_SHADER);

	glShaderSource (vShader, 1, &vshaderSource, NULL);
	glShaderSource (fShader, 1, &fshaderSource, NULL);
	glCompileShader (vShader);
	glCompileShader (fShader);

	GLuint vfProgram = glCreateProgram();
	glAttachShader (vfProgram, vShader);
	glAttachShader (vfProgram, fShader);
	glLinkProgram (vfProgram);

	return vfProgram;
}

float x   = 0;	   // 三角形在X轴的位置
float inc = 0.01; // 移动三角形的偏移量

void
display (GLFWwindow *window, double currTime)
{
	glClear (GL_DEPTH_BUFFER_BIT);
	glClearColor (0, 0, 0, 1);
	glClear (GL_COLOR_BUFFER_BIT); //每次将背景清除为黑色
	glUseProgram (renderingProgram);

	x += inc;					//切换至让三角形向右移动
	if (x > 1.0) inc -= 0.01;	//沿X轴移动三角形
	if (x < -1.0) inc = 0.01;	//切换至让三角形向左移动

	GLuint offsetLoc = glGetUniformLocation (renderingProgram, "offset"); //获取指向offset变量的指针
	glProgramUniform1f (renderingProgram, offsetLoc, x); //将x的值复制给offset

	glDrawArrays (GL_TRIANGLES, 0, 3);

}

void
init (GLFWwindow *window)
{
	renderingProgram = createShaderProgram();
	glGenVertexArrays (numVAOs, vao);
	glBindVertexArray (vao[0]);
}

int
main (int argc, char *argv[])
{
	if (!glfwInit()) {
		return -1;
	}

	glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 6);

	GLFWwindow *window = glfwCreateWindow (600, 600, "Chapter2 - program1", nullptr, nullptr);
	glfwMakeContextCurrent (window);

	int errorCode = glewInit();
	if (errorCode != GLEW_OK) {
		cerr << "Error: " << glewGetErrorString (errorCode) << endl;
		return -1;
	}
	glfwSwapInterval (1);

	init (window);

	while (!glfwWindowShouldClose (window)) {
		display (window, glfwGetTime());
		glfwSwapBuffers (window);
		glfwPollEvents();
	}

	glfwDestroyWindow (window);
	glfwTerminate();

	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值