前面學習了畫普通的圖形,但是顏色比較單一,有什麼好的方法讓圖形顏色更加豐富,更加真實呢?texture(中文譯為紋理)就可以扮演這一角色,本節則簡單說明texture的使用。
執行下面的程式,便可出現乙個黑白相間的棋盤:
1 #include 2 #include 3 #include 4 using namespace std;
5 #define buffer_offset(x) ((const void*) (x))
6 7 enum vao_ids ;
8 enum buffer_ids ;
9 enum attrib_ids ;
10 11 gluint vaos[numvaos];
12 gluint buffers[numbuffers];
13 gluint program;
14 15 glushort indices = ;
19 20 gluint tex;
21 22 const glchar* vertex_shader = "#version 300 es \n"
23 "layout(location=0) in vec3 vposition;\n"
24 "layout(location=1) in vec2 texco;\n"
25 "out vec2 texc;\n"
26 "void main()\n"
27 "\n";
31 32 const glchar* fragment_shader = "#version 300 es \n"
33 "precision highp float; \n"
34 "uniform sampler2d color;\n"
35 "layout(location=0)out vec4 fcolor;\n"
36 "in vec2 texc;\n"
37 "void main()\n"
38 "\n";
41 42 void init_shader()
43 57 58 // fragment shader
59 gluint fragmentshader = glcreateshader(gl_fragment_shader);
60 glshadersource(fragmentshader, 1, &fragment_shader, null);
61 glcompileshader(fragmentshader);
62 // check fragment shader compiling status
63 glgetshaderiv(fragmentshader, gl_compile_status, &compiled);
64 if (!compiled)
65
69 70 // link shaders
71 program = glcreateprogram();
72 glattachshader(program, vertexshader);
73 glattachshader(program, fragmentshader);
74 gllinkprogram(program);
75 76 cout << "prog=" << program << endl;
77 //check link status
78 glint linked;
79 glgetprogramiv(program, gl_link_status, &linked);
80 if (!linked)
81
85 // delete shader
86 gldeleteshader(vertexshader);
87 gldeleteshader(fragmentshader);
88 }
89 90 #define height 8
91 #define width 8
92 unsigned char pic[height][width][4];
93 94 static void gen_texture(void)
95 107 }
108 }
109110 void init_data()
111 ;
130131 glgenbuffers(numbuffers, buffers);
132 glbindbuffer(gl_array_buffer, buffers[arraybuffer]);
133 glbufferdata(gl_array_buffer, sizeof(vertices), vertices, gl_static_draw);
134135 gluint ebo;
136 glgenbuffers(1, &ebo);
137 glbindbuffer(gl_element_array_buffer, ebo);
138 glbufferdata(gl_element_array_buffer, sizeof(indices), indices, gl_static_draw);
139140 glgentextures(1, &tex);
141 glbindtexture(gl_texture_2d, tex);
142143 gltexparameteri(gl_texture_2d, gl_texture_wrap_s, gl_repeat);
144 gltexparameteri(gl_texture_2d, gl_texture_wrap_t, gl_repeat);
145146 gltexparameteri(gl_texture_2d, gl_texture_min_filter, gl_nearest);
147 gltexparameteri(gl_texture_2d, gl_texture_mag_filter, gl_nearest);
148 glteximage2d(gl_texture_2d, 0, gl_rgba, width, height, 0, gl_rgba, gl_unsigned_byte, pic);
149150 gluseprogram(program);
151152 glint texloc = glgetattriblocation(program, "texco");
153 cout << "texloc=" << texloc << endl;
154 glint posloc = glgetattriblocation(program, "vposition");
155 cout << "posloc=" << posloc << endl;
156157 glenablevertexattribarray(posloc);
158 glvertexattribpointer(posloc, 3, gl_float, gl_false, 0, 0);
159160 glenablevertexattribarray(texloc);
161 glvertexattribpointer(texloc, 2, gl_float, gl_false, 0, (void*)(12*sizeof(float)));
162 }
163164 void display()
165
169170 int main(int argc, char* ar**)
171
195 init_shader();
196 init_data();
197 glutdisplayfunc(display);
198 glutmainloop();
199 }
如圖所示:
上面的程式會產生8x8大小的texture,黑白相間。
跟我一起學攝影
咦 好巧!我也是攝影愛好者。咱們一起學習吧。或許你也有這樣的體驗,並茂的文章更能讓人快速進入學習狀態,更何況是攝影,必須有圖。下面是我彙總的資料,必須深入淺出,拒絕一切晦澀難懂。學習課本 1.佳能官網 能系統學習攝影知識,從入門 初級 中級 高階 高階。每個頁面講解乙個知識點,結合實際的拍攝效果,深...
跟我一起學python 跟我一起學人工智慧(一)
跟我一起學人工智慧 一 文 小步 系列第一講正式開課啦,課程全都是可以實操的乾貨,到後面ai演算法 python 可以結合做出乙個簡單的人工智慧應用 因本人也對ai領域涉足不久,如文章有不妥之處還請各位大神與我多多交流,此系列文章也屬於我學習ai過程中的總結,我也會做到盡量寫出只要是高中畢業就能看懂...
讀《跟我一起學Makefile》有感
其實在之前的工作中有很多的機會接觸到makefile,但是總是沒能拿出時間通讀其語法,我想這與自身不夠積極的態度是直接掛鉤的。先說說在這次的收穫 首先從最基本的語法規則到變數定義,熟悉了其最基本的工作流程 再者結合文中的示例,自己再實際練習,熟悉了其中個別函式及特殊規則的應用。在接觸到專案中的mak...