triangles.vert
#version 330layout(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;}triangles.frag
#version 330in vec4 vs_fs_color;layout(location = 0)out vec4 color;void main(void){ color = vs_fs_color;}實(shí)現(xiàn)程序:
#include "stdafx.h"#include<iostream>using namespace std;#include "vgl.h"#include "LoadShaders.h"#include "vmath.h"#define USE_PRIMITIVE_RESTART 1//設(shè)置立方體的8個(gè)角點(diǎn),邊長(zhǎng)為2,中心為原點(diǎn)static const GLfloat cube_positions[] ={ -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,};//每個(gè)頂點(diǎn)的顏色static const GLfloat cube_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, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,};//三角形條帶的索引static const GLushort cube_indices[] ={ 0, 1, 2, 3, 6, 7, 4, 5, //第一組條帶 0xFFFF, //<<--這是重啟動(dòng)的索引 2, 6, 0, 4, 1, 5, 3, 7 //第二組條帶};enum{ Arrayebo, Numebo };enum{ Arrayvao, Numvao };enum{ Arrayvbo, Numvbo };GLuint ebo[Numebo];GLuint vao[Numvao];GLuint vbo[Numvbo];void init(void){ ShaderInfo shaders[] = { { GL_VERTEX_SHADER, "triangles.vert" }, { GL_FRAGMENT_SHADER, "triangles.frag" }, { GL_NONE, NULL } }; GLuint program = LoadShaders(shaders); glUseProgram(program); //設(shè)置元素?cái)?shù)組緩存 glGenBuffers(Numebo, ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[Arrayebo]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(cube_indices), cube_indices, GL_STATIC_DRAW); //設(shè)置頂點(diǎn)屬性 glGenVertexArrays(Numvao, vao); glBindVertexArray(vao[Arrayvao]); glGenBuffers(Numvbo,vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo[Arrayvbo]); glBufferData(GL_ARRAY_BUFFER, sizeof(cube_positions) + sizeof(cube_colors), NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(cube_positions), cube_positions); glBufferSubData(GL_ARRAY_BUFFER, sizeof(cube_positions), sizeof(cube_colors), cube_colors); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)sizeof(cube_positions)); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1);}void display(void){ glClear(GL_COLOR_BUFFER_BIT); //設(shè)置使用glDrawElements glBindVertexArray(vao[Arrayvao]); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo[Arrayebo]);#if USE_PRIMITIVE_RESTART //如果開(kāi)啟了圖元重啟動(dòng),那么只需要調(diào)用一次繪制命令 glEnable(GL_PRIMITIVE_RESTART); //void glPrimitiveRestartIndex(GLuint index); //設(shè)置一個(gè)頂點(diǎn)數(shù)組元素的索引值,用來(lái)指定渲染過(guò)程中,從什么地方啟動(dòng)新的圖元繪制。如果在處理定點(diǎn)數(shù)組元素索引的過(guò)程中 //遇到了一個(gè)符合該索引的數(shù)值,那么系統(tǒng)不會(huì)處理它對(duì)應(yīng)的頂點(diǎn)數(shù)據(jù),而是終止當(dāng)前的圖元繪制,并且從下一個(gè)頂點(diǎn)重新開(kāi)始渲染 //同一類型的圖元集合。 glPrimitiveRestartIndex(0xFFFF); glDrawElements(GL_TRIANGLE_STRip, 17,GL_UNSIGNED_SHORT, NULL);#else glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_SHORT, NULL); glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_SHORT, (const GLvoid*)(9*sizeof(GLushort)));#endif}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)
疑難解答
圖片精選
網(wǎng)友關(guān)注