OpenGL 绘制彩色的三角形

使用openGL绘制图形需要三步:
1.创建一个VBO,使内存中的数据,存到显卡缓存中;VBO的任务就是这一件事;
2.创建一VAO,也就是属性的数组,负责把现存中的的数据,绑定属性,指定数据的使用规则,使着色器明白那些数据是颜色,那些是坐标;
3.着色器程序,运行在GPU中,负责把现存中的数据,通过计算渲染出图片;

绘制一个顶点颜色不同的三角形,需要给三角形的每隔顶点设置一个颜色,这也就需要一些颜色数据。我们可以单独定义一下顶点数据和颜色数据。

    GLfloat ver[] = {
		//如果话两个三角形的话,常规画法,定义两个三角形的位置点
		//第一个三角形
		0.0f,  0.5f, 0.0f,
		-0.5f, -0.5f, 0.0f,
		0.5f, -0.5f, 0.0f,
	};

	GLfloat verColor[] = {
		1.0f,  0.0f, 0.0f, 1.0f,
		0.0f,  1.0f, 0.0f, 1.0f,
		0.0f,  0.0f, 1.0f, 1.0f,
	};

看一下绘制效果:
OpenGL 绘制彩色的三角形_第1张图片

#pragma once
#include 
#include 
#include 
class QOpenGLFunctions_3_3_Core;

class HelloShaderSelf : public QOpenGLWindow {
	Q_OBJECT

public:
	HelloShaderSelf();
	~HelloShaderSelf();

private:
	void initializeGL();
	void resizeGL(int w, int h);
	void paintGL();

private:
	QOpenGLFunctions_3_3_Core* _openGLCore;
	GLuint _VBO;//顶点位置VBO
	GLuint _VBOColor;//顶点颜色VBO
	GLuint _VAO;
	QOpenGLShaderProgram _shaderProgram;//着色器程序,所里系统所有的着色器
};

#include 
#include 
#include 
#include "HelloShaderSelf.h"

HelloShaderSelf::HelloShaderSelf() {
}

HelloShaderSelf::~HelloShaderSelf() {
}

void HelloShaderSelf::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,
	};

	GLfloat verColor[] = {
		1.0f,  0.0f, 0.0f, 1.0f,
		0.0f,  1.0f, 0.0f, 1.0f,
		0.0f,  0.0f, 1.0f, 1.0f,
	};

	_openGLCore->glGenBuffers(1, &_VAO);
	_openGLCore->glGenBuffers(1, &_VBO);
	_openGLCore->glGenBuffers(1, &_VBOColor);

	_openGLCore->glBindVertexArray(_VAO);
	
	//把定位位置数据写入显卡缓存
	_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->glBindBuffer(GL_ARRAY_BUFFER, _VBOColor);
	_openGLCore->glBufferData(GL_ARRAY_BUFFER, sizeof(verColor), verColor, GL_STATIC_DRAW);
	_openGLCore->glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void*)0);
	_openGLCore->glEnableVertexAttribArray(1);

	_openGLCore->glBindVertexArray(0);

	QOpenGLShader vertexShager(QOpenGLShader::Vertex);//顶点着色器
	vertexShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShaderSelf.vert");
	QOpenGLShader fragmentShager(QOpenGLShader::Fragment);//片段着色器
	fragmentShager.compileSourceFile("E:/Projects/QtGuiTest/OPenGLApp/shader/HelloShaderSelf.frag");
	_shaderProgram.addShader(&vertexShager);
	_shaderProgram.addShader(&fragmentShager);

	_shaderProgram.link();
}

void HelloShaderSelf::resizeGL(int w, int h) {

}

void HelloShaderSelf::paintGL() {
	_openGLCore->glClearColor(0.6f, 0.6f, 0.6f, 1.0);
	_openGLCore->glClear(GL_COLOR_BUFFER_BIT);

	_shaderProgram.bind();

	
	_openGLCore->glBindVertexArray(_VAO);



	_openGLCore->glDrawArrays(GL_TRIANGLES, 0, 3);

	update();
}

顶点着色器:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec4 aColor;
out vec4 outColor;
void main(){
	gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
	outColor = aColor;
}

片元着色器:

#version 330 core
out vec4 fragColor;
in vec4 outColor;//从顶点着色器中传过来的颜色

void main(){
	fragColor = outColor;
}

aaa

你可能感兴趣的:(OpenGL,Qt,OpenGL,VBO,三角形,分批发送数据)