OpenGL4.x学习之使用着色器、绑定VAO以及绘制最简单的图元——点
OpenGL4.x是OpenGL系列最新的规范,它为此制定了很多的概念,包括6种着色器、以及诸多内存对象,让简单的三维显示变得不简单。我也是刚刚了解这些新的特性,所以有的地方阐述不正确还请高手们指出来。
原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/19505817
程序源代码下载地址:这里
这次我将沿用上篇文章的框架,在此基础上添加着色器的载入和使用、创建和绑定VAO以及绘制最简单的图元——点。我使用的框架是Qt,而从Qt5.2起,对OpenGL的封装算是很全面了,因此程序可以使用Qt封装的C++风格的类进行实现。不过我打算使用裸的OpenGL的API,因为这更容易被那些使用其他框架开发的同行们理解。
下面是例子程序的核心代码:
/*---------------------------------------------------------------------------*/
// 这里存放了一些全局变量
GLuint g_VertexShader = 0;
GLuint g_FragmentShader = 0;
GLuint g_Program = 0;
GLuint g_VertexArray = 0;
/*---------------------------------------------------------------------------*/
inline QByteArray ShaderData( const QString& fileName )
{
QByteArray result;
QFile shaderFile( fileName );
if ( shaderFile.open( QIODevice::ReadOnly ) )
{
result = shaderFile.readAll( );
shaderFile.close( );
}
return result;
}
/*---------------------------------------------------------------------------*/
void GLWindow::InitGL( void )
{
// 初始化顶点着色器
QByteArray vsData = ShaderData( ":/Shader.vert" );
const char* vsPointer = vsData.constData( );
g_VertexShader = glCreateShader( GL_VERTEX_SHADER );
glShaderSource( g_VertexShader, // 着色器标识
1, // 着色器文本数目
&vsPointer, // 着色器字符串指针
Q_NULLPTR ); // 字符串长度
glCompileShader( g_VertexShader );
// 初始化片断着色器
QByteArray fsData = ShaderData( ":/Shader.frag" );
const char* fsPointer = fsData.constData( );
g_FragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource( g_FragmentShader, // 着色器标识
1, // 着色器文本数目
&fsPointer, // 着色器字符串
Q_NULLPTR ); // 字符串长度
glCompileShader( g_FragmentShader );
// 初始化着色器程序
g_Program = glCreateProgram( );
glAttachShader( g_Program, g_VertexShader );
glAttachShader( g_Program, g_FragmentShader );
glLinkProgram( g_Program );
// 删除着色器
glDeleteShader( g_VertexShader );
glDeleteShader( g_FragmentShader );
// 初始化顶点数组对象(VAO)
glGenVertexArrays( 1, &g_VertexArray );
glBindVertexArray( g_VertexArray );
glPointSize( 10.0f );
}
/*---------------------------------------------------------------------------*/
void GLWindow::ResizeGL( int width, int height )
{
glViewport( 0, 0, width, height );
}
/*---------------------------------------------------------------------------*/
void GLWindow::RenderGL( void )
{
static const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
glClearBufferfv( GL_COLOR, 0, black );
glUseProgram( g_Program );
glDrawArrays( GL_POINTS, 0, 1 );
}
/*---------------------------------------------------------------------------*/
void GLWindow::ReleaseGL( void )
{
glDeleteVertexArrays( 1, &g_VertexArray );
glDeleteProgram( g_Program );
}
程序在InitGL()函数中创建了顶点着色器和片断着色器对象并且用着色器程序将其链接起来。最后初始化了顶点数组对象(Vertex Array Object,VAO),并且绑定之,以及设定了点的大小。而顶点着色器和片断着色器在本例中也非常的简单:
Shader.vert
#version 430 core
void main( void )
{
gl_Position = vec4( 0.0, 0.0, 0.0, 1.0 );
}Shader.frag
#version 430 core
out vec4 color;
void main( void )
{
color = vec4( 1.0, 1.0, 1.0, 1.0 );
}
顶点着色器中指明了绘制图元的位置在三维点( 0, 0, 0 )上,片断着色器中表示绘制的颜色是不透明的白色。与OpenGL(ES) 2.x不同,着色器不再用varying来表示从某一着色器到另外一着色器传递数据,而是使用in表示传入数据,out表示数据传入下一阶段。以下是程序的演示效果:
OpenGL4.x学习之使用着色器、绑定VAO以及绘制最简单的图元——点
原文:http://blog.csdn.net/gamesdev/article/details/19505817