OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv
—— 2024-07-14 晚上
bilibili赵新政老师的教程看后笔记
code review!
文章目录
- OpenGL笔记十三之Uniform向量数据传输、使用glUniform3f和glUniform3fv
- 1.glUniform3f
- 1.1.运行
- 1.2.vs
- 1.3.fs
- 1.4.shader.h关键部分
- 1.5.shader.cpp关键部分
- 1.6.main.cpp关键部分
- 2.glUniform3fv
- 2.1.运行
- 2.2.vs同上
- 2.3.fs同上
- 2.4.shader.h关键部分
- 2.5.shader.cpp关键部分
- 2.6.main.cpp关键部分
1.glUniform3f
1.1.运行
1.2.vs
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;out vec3 color;void main()
{gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);color = aColor;
}
1.3.fs
#version 330 core
out vec4 FragColor;uniform vec3 uColor;void main()
{FragColor = vec4(uColor, 1.0f);
}
1.4.shader.h关键部分
void setVector3(const std::string& name, float x, float y, float z);
1.5.shader.cpp关键部分
void Shader::setVector3(const std::string& name, float x, float y, float z){// 1 通过名称拿到Uniform变量的位置LocationGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));// 2 通过Location更新Uniform变量的值GL_CALL(glUniform3f(location, x, y, z));
}
1.6.main.cpp关键部分
void render() {//执行opengl画布清理操作GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//1 绑定当前的programshader->begin();shader->setVector3("uColor",0.3, 0.4, 0.5);//2 绑定当前的vaoGL_CALL(glBindVertexArray(vao));//3 发出绘制指令glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);glBindVertexArray(0);shader->end();
}int main() {if (!app->init(800, 600)) {return -1;}app->setResizeCallback(OnResize);app->setKeyBoardCallback(OnKey);//设置opengl视口以及清理颜色GL_CALL(glViewport(0, 0, 800, 600));GL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));prepareShader();prepareVAO();while (app->update()) {render();}app->destroy();return 0;
}
2.glUniform3fv
2.1.运行
2.2.vs同上
2.3.fs同上
2.4.shader.h关键部分
#pragma once#include "core.h"
#include<string>class Shader {
public:Shader(const char* vertexPath, const char* fragmentPath);~Shader();void begin();//开始使用当前Shadervoid end();//结束使用当前Shadervoid setFloat(const std::string& name, float value);void setVector3(const std::string& name, float x, float y, float z);// 重载void setVector3(const std::string& name, const float* values);private://shader program//type:COMPILE LINKvoid checkShaderErrors(GLuint target,std::string type);private:GLuint mProgram{ 0 };
};
2.5.shader.cpp关键部分
void Shader::setVector3(const std::string& name, const float* values){// 1 通过名称拿到Uniform变量的位置LocationGLint location = GL_CALL(glGetUniformLocation(mProgram, name.c_str()));// 2 通过Location更新Uniform变量的值// 第二个参数:当前要更新的uniform变量如果三数组,数组里面包括多少个向量vec3GL_CALL(glUniform3fv(location, 1, values));
}
2.6.main.cpp关键部分
void render() {//执行opengl画布清理操作GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//1 绑定当前的programshader->begin();float color[] = {0.9, 0.3, 0.25};shader->setVector3("uColor",color);//2 绑定当前的vaoGL_CALL(glBindVertexArray(vao));//3 发出绘制指令glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);glBindVertexArray(0);shader->end();
}