首页 > 学院 > 开发设计 > 正文

Opengl学习程序之绘制命令

2019-11-10 21:35:58
字体:
来源:转载
供稿:网友

triangles.vert

#version 330uniform mat4 model_matrix;layout(location = 0)in vec4 position;layout(location = 1)in vec4 color;out vec4 vs_fs_color;void main(void){ vs_fs_color = color; gl_Position = position*model_matrix;}

triangles.frag

#version 330in vec4 vs_fs_color;layout(location = 0)out vec4 color;void main(void){ color = vs_fs_color;}

实现程序:有bug,未达到画4个三角形的效果

#include "stdafx.h"#include<iostream>using namespace std;#include "vgl.h"#include "LoadShaders.h"#include "vmath.h"enum ebo_IDs{ Arrayebo, Numebo };GLuint ebo[Numebo];enum vao_IDs{ Arrayvao, Numvao };GLuint vao[Numvao];enum vbo_IDs{ Arrayvbo, Numvbo };GLuint vbo[Numvbo];GLint render_model_matrix_loc;void init(){ static const GLfloat vertex_positions[] = { -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, }; static const GLfloat vertex_colors[] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, }; static const GLushort vertex_indices[] = { 0, 1, 2 }; glGenBuffers(Numebo, ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[Arrayebo]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_indices), vertex_indices, GL_STATIC_DRAW); glGenVertexArrays(Numvao, vao); glBindVertexArray(vao[Arrayvao]); glGenBuffers(Numvbo, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo[Arrayvbo]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_positions)+sizeof(vertex_colors), NULL, GL_STATIC_DRAW); //void glBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid *data) //使用新的数据替换缓存对象中的部分数据。绑定到target的缓存对象要从offset字节处开始需要使用地址为data,大小为size的数据块来进行更新。 //如果offset和size的总和超过了缓存对象绑定数据的范围,那么将产生一个错误。 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertex_positions), vertex_positions); glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertex_positions), sizeof(vertex_colors), vertex_colors); ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "triangles.vert" }, { GL_FRAGMENT_SHADER, "triangles.frag" }, { GL_NONE, NULL } }; GLuint PRogram = LoadShaders(shaders); glUseProgram(program); //GLint glGetUniformLocation(GLuint program,const char*name) //返回着色器程序中uniform变量name对应的索引值。name是一个以NULL结尾的字符串,不存在空格。如果name与启用的着色器程序中的所有uniform变量都不相符, //或者name是一个内部保留的着色器变量名称(例如,以gl_开头的变量),那么返回值为-1.name可以是单一的变量名称,数组中的一个元素(此时name主要包含方括号 //以及对应的索引数字),或者结构体的域变量(设置name时,需要在结构体变量名称之后添加"."符号,再添加域变量名称,并与着色器程序中的写法一致)。对于 //uniform变量数组也可以只通过指定数组的名称来获取数组中的第一个元素(例如直接用arrayName),或者也可以通过指定索引值来获取数组的第一个元素(例如写作 //arrayName[0].除非我们重新链接着色器程序(glLinkProgram())否则这里的返回值不会发生变化。 render_model_matrix_loc = glGetUniformLocation(program, "model_matrix"); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(vertex_positions))); glEnableVertexAttribArray(1);}void display(void){ glClear(GL_COLOR_BUFFER_BIT); glBindVertexArray(vao[Arrayvao]); vmath::mat4 model_matrix; //static inline Tmat4<T> translate(T x, T y, T z) //{ //return Tmat4<T>(Tvec4<T>(1.0f, 0.0f, 0.0f, 0.0f), //Tvec4<T>(0.0f, 1.0f, 0.0f, 0.0f), //Tvec4<T>(0.0f, 0.0f, 1.0f, 0.0f), //Tvec4<T>(x, y, z, 1.0f)); //} model_matrix = vmath::translate(-0.3f, 0.0f, -5.0f); //void glUniformMatrix{2x3,2x4,3x2,3x4,4x2,4x3}{fd}v(GLint location,GLsizei count,GLboolean transpose,const GLfloat*value) //设置与location索引位置对应的uniform变量的值。其中向量形式的函数会载入cout个数据的集合(根据glUniform*()的调用方式,读入1~4个值), //并写入location位置的uniform变量。如果location是数组的索引值,那么数组之后的连续count个元素都会被载入。如果transpose设置为GL_TRUE, //那么values中的数据是以行主序的顺序读入,如果是GL_FALSE,那么value中的数据失忆列主序的顺序读入的。 glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix); //使用数组元素建立连续的几何图元序列,每个启用的数组中起始位置为first,结束位置为first+count-1。mode表示构建图元的类型,它必须是GL_TRIANGLES //GL_LINE_LOOP,GL_LINES,GL_POINTS等类型标识符之一。 glDrawArrays(GL_TRIANGLES, 0, 3); model_matrix = vmath::translate(-1.0f, 0.0f, -5.0f); glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix); //使用count个元素来定义一系列几何图元,而元素的索引值保存在一个绑定到GL_ELEMENT_ARRAY_BUFFER的缓存中。indices定义了元素数组缓存中的偏移地址, //也就是索引数据开始的位置,单位为字节。type必须是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT或者GL_UNSIGNED_NIT中的一个,它给出了元素数组缓存中索引 //数据的类型。mode定义了图元构建的方式,它必须是图元类型标识符中的一个,例如GL_TRIANGES,GL_LINE_LOOP,GL_LINES,或者GL_POINTS. glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL); model_matrix = vmath::translate(1.0f, 0.0f, -5.0f); glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix); //void glDrawElementsBaseVertex(GLenum mode,GLsizei count,GLenum type,const GLvoid* indices,GLint basevertex) //本质上与glDrawElements()并无区别,但是它的第i个元素在传入绘制命令时,实际上读取的是各个顶点属性数组中的第indices[i]+basevertex个元素。 glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, NULL, 1); model_matrix = vmath::translate(3.0f, 0.0f, -5.0f); glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix); //void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count,GLsizei primcount); //其中primcount表示多实例的个数 glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1); glFlush();}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(512, 512); glutInitContextVersion(3, 3); glutCreateWindow(argv[0]); glewExperimental = GL_TRUE; if (glewInit()) { cerr << "Unable to initialize GLEW ... exiting" << endl; exit(EXIT_FAILURE); } init(); glutDisplayFunc(display); glutMainLoop();}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表