Uniform的理解

14 篇文章 0 订阅

Uniform:一种从Cpu的应用,向Gpu中的着色器发送数据的方式,它是全局的,可以被任意着色器程序在任意阶段访问。
若声明了一个Uniform却没用过,编译器会默认移除这个变量,导致编译出的版本并不包含它,可能会导致非常大的问题!!!
着色器frag程序:

	#version 330 core
	out vec4 FragColor;
	uniform vec4 ourColor;
	void main(){
    	FragColor = ourColor;
	}

initializeGL()函数:

	initializeOpenGLFunctions();
	//创建VBO和VAO对象,并赋予ID
	glGenVertexArrays(1, &VAO);
	glGenBuffers(1, &VBO);
	//绑定VBO和VAO对象
	glBindVertexArray(VAO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	//为当前绑定到target的缓冲区对象创建一个新的数据存储。
	//如果data不是NULL,则使用来自此指针的数据初始化数据存储
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
	//告知显卡如何解析缓冲里的属性值
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	//开启VAO管理的第一个属性值
	glEnableVertexAttribArray(0);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	bool success;
	shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, "shaders/shapes.vert");
shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, "shaders/shapes.frag");
	success = shaderProgram.link();
	if (!success)
		qDebug() << "ERR:" << shaderProgram.log();
	// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glGenBuffers(1, &EBO);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
	glBindVertexArray(0);

paintGL()函数:

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	shaderProgram.bind();
	glBindVertexArray(VAO);
	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);

定时器on_timeout()函数

	makeCurrent();
	int timeValue = QTime::currentTime().second();
	float blueValue = (sin(timeValue) / 2.0f)+0.5 ;
	float greenValue = (sin(timeValue) / 2.0f) + 0.5;
	//float redValue = (sin(timeValue) / 2.0f) + 0.5;
	shaderProgram.setUniformValue("ourColor", blueValue, greenValue, 1.0f, 1.0f);
	doneCurrent();
	update();

动态效果图如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值