跟我一起學OpenGL texture 紋理

2021-09-25 03:20:05 字數 4753 閱讀 5615

前面學習了畫普通的圖形,但是顏色比較單一,有什麼好的方法讓圖形顏色更加豐富,更加真實呢?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...