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;}實(shí)現(xiàn)程序:有bug,未達(dá)到畫4個(gè)三角形的效果
#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) //使用新的數(shù)據(jù)替換緩存對象中的部分?jǐn)?shù)據(jù)。綁定到target的緩存對象要從offset字節(jié)處開始需要使用地址為data,大小為size的數(shù)據(jù)塊來進(jìn)行更新。 //如果offset和size的總和超過了緩存對象綁定數(shù)據(jù)的范圍,那么將產(chǎn)生一個(gè)錯(cuò)誤。 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對應(yīng)的索引值。name是一個(gè)以NULL結(jié)尾的字符串,不存在空格。如果name與啟用的著色器程序中的所有uniform變量都不相符, //或者name是一個(gè)內(nèi)部保留的著色器變量名稱(例如,以gl_開頭的變量),那么返回值為-1.name可以是單一的變量名稱,數(shù)組中的一個(gè)元素(此時(shí)name主要包含方括號 //以及對應(yīng)的索引數(shù)字),或者結(jié)構(gòu)體的域變量(設(shè)置name時(shí),需要在結(jié)構(gòu)體變量名稱之后添加"."符號,再添加域變量名稱,并與著色器程序中的寫法一致)。對于 //uniform變量數(shù)組也可以只通過指定數(shù)組的名稱來獲取數(shù)組中的第一個(gè)元素(例如直接用arrayName),或者也可以通過指定索引值來獲取數(shù)組的第一個(gè)元素(例如寫作 //arrayName[0].除非我們重新鏈接著色器程序(glLinkProgram())否則這里的返回值不會(huì)發(fā)生變化。 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) //設(shè)置與location索引位置對應(yīng)的uniform變量的值。其中向量形式的函數(shù)會(huì)載入cout個(gè)數(shù)據(jù)的集合(根據(jù)glUniform*()的調(diào)用方式,讀入1~4個(gè)值), //并寫入location位置的uniform變量。如果location是數(shù)組的索引值,那么數(shù)組之后的連續(xù)count個(gè)元素都會(huì)被載入。如果transpose設(shè)置為GL_TRUE, //那么values中的數(shù)據(jù)是以行主序的順序讀入,如果是GL_FALSE,那么value中的數(shù)據(jù)失憶列主序的順序讀入的。 glUniformMatrix4fv(render_model_matrix_loc, 1, GL_FALSE, model_matrix); //使用數(shù)組元素建立連續(xù)的幾何圖元序列,每個(gè)啟用的數(shù)組中起始位置為first,結(jié)束位置為first+count-1。mode表示構(gòu)建圖元的類型,它必須是GL_TRIANGLES //GL_LINE_LOOP,GL_LINES,GL_POINTS等類型標(biāo)識符之一。 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個(gè)元素來定義一系列幾何圖元,而元素的索引值保存在一個(gè)綁定到GL_ELEMENT_ARRAY_BUFFER的緩存中。indices定義了元素?cái)?shù)組緩存中的偏移地址, //也就是索引數(shù)據(jù)開始的位置,單位為字節(jié)。type必須是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT或者GL_UNSIGNED_NIT中的一個(gè),它給出了元素?cái)?shù)組緩存中索引 //數(shù)據(jù)的類型。mode定義了圖元構(gòu)建的方式,它必須是圖元類型標(biāo)識符中的一個(gè),例如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) //本質(zhì)上與glDrawElements()并無區(qū)別,但是它的第i個(gè)元素在傳入繪制命令時(shí),實(shí)際上讀取的是各個(gè)頂點(diǎn)屬性數(shù)組中的第indices[i]+basevertex個(gè)元素。 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表示多實(shí)例的個(gè)數(shù) 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();}新聞熱點(diǎn)
疑難解答