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();}新聞熱點
疑難解答