本文根据教程:ogldev进行扩充学习,一步步从零开始,记录学习历程
一、uniform 存储限制符
- 在着色器运行之前,uniform修饰符可以指定一个在应用程序中设置好的变量,它不会在图元处理过程中发生变化
- uniform变量在所有可用的着色阶段之间都是共享的,它必须定义为全局变量
- 任何类型的变量(包括结构体和数组)都可以设置为uniform变量
- 着色器无法写入到uniform变量,也无法改变它的值
example:在着色器中声明一个uniform变量
uniform float gScale;
在着色器中可以根据名字引用gScale这个变量,如果需要在用户应用程序中设置它的值,则需要两步:
1. 使用glGetUniformLocation()函数获得gScale在列表中的索引
2. 通过glUniform*()或者glUniformMatrix*()系列函数来设置uniform变量的值(gScale是基本float类型的变量所以用glUniform1f())
简单来说,Uniform变量就是应用程序用来向着色器中传递的一个类型和着色器运行时不变的值。
二、代码解释
2.1 opengl_math:
#ifndef __OPENGL_MATH_H
#define __OPENGL_MATH_H
//向量
typedef float Vector3f[3];
//向量赋值
inline void LoadVector3(Vector3f v, const float x, const float y, const float z)
{
v[0] = x; v[1] = y; v[2] = z;
}
#endif
跟上一节没有区别,因为这一节只是增加了uniform存储限制符的应用
2.2 main.cpp:
#include <stdio.h>
#include <string>
#include <math.h>
#include <gl/glew.h>
#include <gl/freeglut.h>
#include <fstream>
#include <assert.h>
#include "opengl_math.h"
using namespace std;
GLuint VBO;
GLint gScaleLocation; //位置中间变量
const char* pVSFileName = "shader.vs";