当前位置:网站首页>OpenGL 着色器使用
OpenGL 着色器使用
2022-07-03 11:06:00 【wb175208】
着色器是OpenGL中很重要的概念,是运行在GPU上的小程序
1.顶点着色器
#version 330 core
layout (location=0) in vec3 aPos;
out vec4 vertextColor;
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertextColor = vec4(1.0, 1.0, 0.0, 1.0);
}
#version 330 core
当前使用版本和openGL的版本号对应
layout (location=0) in vec3 aPos;
location 设置外部输入数据的位置变量的属性位置值,上面展示了外部数据aPos的位置变量属性值为0。in 表示输入, out 表示输出
aPos 定义一个变量输入位置坐标
gl_Position 是GLSL内部的关键字,用来GPU的位置显示
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);接收外部输入的坐标
out vec4 vertextColor;在顶点着色器定义颜色,可以一直穿到片段着色器。片段着色器中只要定义一相同的变量接收就可以了
2.片段着色器
#version 330 core
out vec4 fragColor;
in vec4 vertextColor;//从顶点着色器中传过来的颜色
void main(){
//fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
fragColor = vertextColor;
}
注意:每个顶点着色器只能有一个输出变量!!!
3.从CPU向GPU传送数据
在着色器中使用关键字uniform
着色器中定义
uniform vec4 randColor;
GLuint randColor = _shaderProgram.uniformLocation("randColor");
_shaderProgram.setUniformValue(randColor, QVector4D(0.4, qAbs(qSin((float)time.elapsed()/1000.0)),0.3 ,1.0));
4.代码示例
#pragma once
#include <QOpenGLWindow>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QTime>
class QOpenGLFunctions_3_3_Core;
class HelloShader : public QOpenGLWindow {
Q_OBJECT
public:
HelloShader();
~HelloShader();
private:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
private:
QOpenGLFunctions_3_3_Core* _openGLCore;
GLuint _VBO;
GLuint _VAO;
QOpenGLShaderProgram _shaderProgram;//着色器程序,所里系统所有的着色器
QTime time = QTime::currentTime();
};
#include "HelloShader.h"
#include <QOpenGLFunctions_3_3_Core>
#include <QVector4D>
#include <QMath.h>
HelloShader::HelloShader() {
}
HelloShader::~HelloShader() {
}
void HelloShader::initializeGL() {
_openGLCore = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
GLfloat ver[] = {
//如果话两个三角形的话,常规画法,定义两个三角形的位置点
//第一个三角形
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
_openGLCore->glGenBuffers(1, &_VAO);
_openGLCore->glBindVertexArray(_VAO);
_openGLCore->glGenBuffers(1, &_VBO);
_openGLCore->glBindBuffer(GL_ARRAY_BUFFER, _VBO);
_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(ver), ver, GL_STATIC_DRAW);
_openGLCore->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
_openGLCore->glEnableVertexAttribArray(0);
_openGLCore->glBindVertexArray(0);
QOpenGLShader vertexShager(QOpenGLShader::Vertex);//顶点着色器
vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShader.vert");
QOpenGLShader fragmentShager(QOpenGLShader::Fragment);//片段着色器
fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShader.frag");
_shaderProgram.addShader(&vertexShager);
_shaderProgram.addShader(&fragmentShager);
_shaderProgram.link();
}
void HelloShader::resizeGL(int w, int h) {
}
void HelloShader::paintGL() {
_openGLCore->glClearColor(0.6f, 0.6f, 0.6f, 1.0);
_openGLCore->glClear(GL_COLOR_BUFFER_BIT);
_shaderProgram.bind();
GLuint randColor = _shaderProgram.uniformLocation("randColor");
_shaderProgram.setUniformValue(randColor, QVector4D(0.4, qAbs(qSin((float)time.elapsed()/1000.0)),0.3 ,1.0));
_openGLCore->glBindVertexArray(_VAO);
_openGLCore->glDrawArrays(GL_TRIANGLES, 0, 3);
update();
}
顶点着色器:
#version 330 core
layout (location=0) in vec3 aPos;
out vec4 vertextColor;
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
vertextColor = vec4(1.0, 1.0, 0.0, 1.0);
}
片段着色器
#version 330 core
out vec4 fragColor;
in vec4 vertextColor;//从顶点着色器中传过来的颜色
uniform vec4 randColor;
void main(){
//fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
//fragColor = vertextColor;
fragColor = randColor;
}
运行结果:
以上!
aaa
边栏推荐
- Xml的(DTD,xml解析,xml建模)
- Duplicate numbers in the array of sword finger offer 03
- GCC compilation process and dynamic link library and static link library
- Some common terms
- Yintai department store ignites the city's "night economy"
- Extrapolated scatter data
- vulnhub之GeminiInc v2
- vulnhub之pyexp
- Kubernetes 三打探针及探针方式
- 一些常用术语
猜你喜欢
vulnhub之presidential
GCC compilation process and dynamic link library and static link library
AOSP ~ NTP ( 网络时间协议 )
Vulnhub narak
Based on MCU, how to realize OTA differential upgrade with zero code and no development?
2022 northeast four provinces match VP record / supplementary questions
Machine learning 3.2 decision tree model learning notes (to be supplemented)
Numpy np.max和np.maximum实现relu函数
Web安全总结
Numpy np. Max and np Maximum implements the relu function
随机推荐
鸿蒙第四次培训
《剑指offer 04》二维数组查找
GCC compilation process and dynamic link library and static link library
How should intermediate software designers prepare for the soft test
Spl06-007 air pressure sensor (example of barometer)
ArcGIS应用(二十一)Arcmap删除图层指定要素的方法
PHP基础
. \vmware-vdiskmanager. exe -k “c:\\xxxxx.vmdk”
并发编程-单例
After watching the video, AI model learned to play my world: cutting trees, making boxes, making stone picks, everything is good
Some common terms
Capturing and sorting out external Fiddler -- Conversation bar and filter [2]
Concurrent programming - singleton
R语言使用gridExtra包的grid.arrange函数将lattice包的多个可视化图像横向组合起来,ncol参数自定义组合图列数、nrow参数自定义组合图行数
ftp登录时,报错“530 Login incorrect.Login failed”
2022年中南大学夏令营面试经验
POI excel cell wrap
STL Tutorial 9 deep copy and shallow copy of container elements
(database authorization - redis) summary of unauthorized access vulnerabilities in redis
Nestjs configuration service, configuring cookies and sessions