teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

文章を修正

2021/04/26 06:43

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -228,4 +228,313 @@
228
228
  //fragment = vec4(0.0,0.0,1.0,1.0);
229
229
 
230
230
  }
231
+ ```
232
+
233
+
234
+ ```cpp
235
+ #include "Shader.hpp"
236
+
237
+ #include <iostream>
238
+ #include <fstream>
239
+ #include <string>
240
+ #include <vector>
241
+
242
+ #include <glm/gtc/type_ptr.hpp>
243
+
244
+ //コンストラクタ
245
+ Shader::Shader(const char* vert, const char* frag)
246
+ {
247
+ program = loadProgram(vert,frag);
248
+ if (program == 0)
249
+ {
250
+ std::cerr << "シェーダープログラム作成エラー"<<std::endl;
251
+ exit(1);
252
+ }
253
+
254
+
255
+
256
+
257
+ //std::cout<< program << std::endl;
258
+
259
+ }
260
+
261
+ //シェーダーをロード
262
+ GLuint Shader::loadProgram(const char* vert, const char* frag)
263
+ {
264
+ std::vector<GLchar> vsrc;
265
+ const bool vstat = ReadShaderSource(vert, vsrc);
266
+
267
+ std::vector<GLchar> fsrc;
268
+ const bool fstat = ReadShaderSource(frag, fsrc);
269
+
270
+
271
+ if (vstat && fstat)
272
+ {
273
+ return CreateProgram(vsrc.data(), fsrc.data());
274
+ }
275
+ else {
276
+ return 0;
277
+ }
278
+ }
279
+
280
+
281
+
282
+ //シェーダーファイルを読み込む
283
+ bool Shader::ReadShaderSource(const char* name, std::vector<GLchar>& buffer)
284
+ {
285
+ if (name == NULL)
286
+ {
287
+ return false;
288
+ }
289
+
290
+
291
+ std::ifstream file(name, std::ios::binary);
292
+ if (file.fail())
293
+ {
294
+ std::cerr << "ソースファイルが読み込めません: " << name << std::endl;
295
+ file.close();
296
+ return false;
297
+ }
298
+
299
+ file.seekg(0L, std::ios::end);
300
+ GLsizei length = static_cast<GLsizei>(file.tellg());
301
+ buffer.resize(length + 1);
302
+
303
+ file.seekg(0L, std::ios::beg);
304
+ file.read(buffer.data(), length);
305
+ buffer[length] = '\0';
306
+
307
+ if (file.fail())
308
+ {
309
+ std::cerr << "ソースファイルを読み込めません: " << name << std::endl;
310
+ file.close();
311
+
312
+ return false;
313
+ }
314
+
315
+ file.close();
316
+ return true;
317
+ }
318
+
319
+
320
+ //シェーダーエラーログを取得
321
+ GLboolean Shader::CompileInfoLog(GLuint shader,const char* str)
322
+ {
323
+ GLint status;
324
+
325
+ //コンパイル結果
326
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
327
+ if (status == GL_FALSE)
328
+ {
329
+ std::cerr <<"Compile Error: " << str << std::endl;
330
+ }
331
+
332
+ //エラーログの長さを得る
333
+ GLsizei bufSize;
334
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &bufSize);
335
+
336
+ if (bufSize > 1)
337
+ {
338
+ std::vector<GLchar> infoLog(bufSize);
339
+ GLsizei length;
340
+ glGetShaderInfoLog(shader, bufSize, &length, &infoLog[0]);
341
+
342
+ std::cerr<< &infoLog[0] << std::endl;
343
+ }
344
+
345
+
346
+
347
+ return (GLboolean)status;
348
+ }
349
+
350
+
351
+
352
+
353
+ //プログラムオブジェクト作成
354
+ GLuint Shader::CreateProgram(const char* vsrc, const char* fsrc)
355
+ {
356
+ const GLuint program = glCreateProgram(); //シェーダープログラムを作成
357
+
358
+ //std::cout << program << std::endl;
359
+
360
+ if (vsrc != NULL)
361
+ {
362
+ const GLuint vobj = glCreateShader(GL_VERTEX_SHADER);
363
+ glShaderSource(vobj, 1, &vsrc, NULL);
364
+ glCompileShader(vobj);
365
+
366
+ CompileInfoLog(vobj, vsrc);
367
+
368
+ glAttachShader(program, vobj);
369
+ glDeleteShader(vobj);
370
+
371
+ }
372
+ else {
373
+ std::cout << "頂点シェーダー読み込み失敗" << std::endl;
374
+ }
375
+
376
+ if (fsrc != NULL)
377
+ {
378
+ const GLuint fobj = glCreateShader(GL_FRAGMENT_SHADER);
379
+ glShaderSource(fobj, 1, &fsrc, NULL);
380
+ glCompileShader(fobj);
381
+
382
+ CompileInfoLog(fobj, fsrc);
383
+
384
+ glAttachShader(program, fobj);
385
+ glDeleteShader(fobj);
386
+ }
387
+ else {
388
+ std::cout << "フラグメントシェーダー読み込み失敗" << std::endl;
389
+
390
+ }
391
+
392
+ glLinkProgram(program);
393
+
394
+ ProgramInfoLog(program);
395
+
396
+
397
+ return program;
398
+ }
399
+
400
+ //プログラムのエラーを表示
401
+ GLboolean Shader::ProgramInfoLog(GLuint program)
402
+ {
403
+ GLsizei bufSize;
404
+ glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufSize);
405
+
406
+ if (bufSize > 1)
407
+ {
408
+ std::vector<GLchar> infoLog(bufSize);
409
+
410
+ GLsizei length;
411
+ glGetProgramInfoLog(program, bufSize, &length, &infoLog[0]);
412
+ std::cerr<<"Program Info Log: "<< infoLog.data() <<std::endl;
413
+
414
+ return false;
415
+ }
416
+ else
417
+ {
418
+ return true;
419
+ }
420
+ }
421
+
422
+
423
+
424
+
425
+ //locationを取得
426
+ GLint Shader::getAttribLocation(const char* str)
427
+ {
428
+ return glGetAttribLocation(program,str);
429
+ }
430
+
431
+
432
+
433
+ //頂点シェーダーに属性変数を関連ずける
434
+ void Shader::setBindAttribVertex(const char* str)
435
+ {
436
+ GLint n = glGetAttribLocation(program, str);
437
+
438
+ //エラー処理
439
+ if (n == -1)
440
+ {
441
+ std::cerr <<"setBindAttribVertex(): "<< n << std::endl;
442
+ }
443
+ else
444
+ {
445
+ glBindAttribLocation(program, n, str);
446
+ }
447
+ }
448
+
449
+
450
+ //フラグメントシェーダーに属性変数を関連ずける
451
+ void Shader::setBindAttribFragment(const char* str)
452
+ {
453
+ GLint n = glGetAttribLocation(program, str);
454
+
455
+ //エラー処理
456
+ if (n == -1)
457
+ {
458
+ std::cerr << "setBindAttribFragment(): " << n << std::endl;
459
+ }
460
+ else
461
+ {
462
+ glBindFragDataLocation(program, n, str);
463
+ }
464
+ }
465
+
466
+ //有効にする
467
+ void Shader::setEnable()
468
+ {
469
+ glUseProgram(program);
470
+
471
+ }
472
+
473
+ //無効にする
474
+ void Shader::setDisable()
475
+ {
476
+ glUseProgram(0);
477
+
478
+ }
479
+
480
+
481
+ // ######################################################### Uniform 設定
482
+
483
+ //vec1
484
+ void Shader::setUniform1f(const char* name, const float vec)
485
+ {
486
+ const GLuint object = glGetUniformLocation(program, name);
487
+ glUniform1f(object,vec);
488
+ }
489
+
490
+ //vec2
491
+ void Shader::setUniform2f(const char* name, const glm::vec2 vec)
492
+ {
493
+ const GLuint object = glGetUniformLocation(program, name);
494
+ glUniform2f(object,vec.x,vec.y);
495
+ }
496
+
497
+ //vec3
498
+ void Shader::setUniform3f(const char* name, const glm::vec3 vec)
499
+ {
500
+ const GLuint object = glGetUniformLocation(program, name);
501
+ glUniform3f(object,vec.x, vec.y,vec.z);
502
+ }
503
+
504
+ //vec4
505
+ void Shader::setUniform4f(const char* name, const glm::vec4 vec)
506
+ {
507
+ const GLuint object = glGetUniformLocation(program,name);
508
+ glUniform4f(object, vec.x, vec.y, vec.z, vec.w);
509
+ }
510
+
511
+
512
+ //行列2
513
+ void Shader::setUniformMatrix2fv(const char* name, const glm::mat2 m)
514
+ {
515
+ const GLuint object = glGetUniformLocation(program, name);
516
+ glUniformMatrix2fv(object,1,false,glm::value_ptr(m));
517
+ }
518
+
519
+ //行列3
520
+ void Shader::setUniformMatrix3fv(const char* name, const glm::mat3 m)
521
+ {
522
+ const GLuint object = glGetUniformLocation(program, name);
523
+ glUniformMatrix3fv(object, 1, false, glm::value_ptr(m));
524
+ }
525
+
526
+ //行列4
527
+ void Shader::setUniformMatrix4fv(const char* name, const glm::mat4 m)
528
+ {
529
+ const GLuint object = glGetUniformLocation(program, name);
530
+ glUniformMatrix4fv(object, 1, false, glm::value_ptr(m));
531
+
532
+ }
533
+
534
+ //デストラクタ
535
+ Shader::~Shader()
536
+ {
537
+
538
+ }
539
+
231
540
  ```

2

文章を修正しました。

2021/04/26 06:43

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,8 @@
1
1
  提示コードの頂点シェーダーコードなのですが参考サイトを参考にモデル行列計算やすべての行列計算をシェーダーで行いたいのですが画面に正方形の四角い線が描画されません。これはなぜなのでしょうか?そもそもシェーダーでは出来ないのでしょうか?行列をかける順番や処理の内容を参考サイトを参考によく考えましたがどうしても原因がわかりません。
2
2
 
3
+ [参考サイト](http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/)
3
4
 
4
- 参考サイト: http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/
5
5
 
6
-
7
6
  ```cpp
8
7
  #include "DrawTest.hpp"
9
8
 

1

文章を修正

2021/04/26 05:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 提示コードの頂点シェーダーコードなのですが参考サイトを参考にモデル行列計算やすべての行列計算をシェーダーで行いたいのですが画面に正方形の四角い線が描画されません。これはなぜなのでしょうか?そもそもシェーダーでは出来ないのでしょうか?
1
+ 提示コードの頂点シェーダーコードなのですが参考サイトを参考にモデル行列計算やすべての行列計算をシェーダーで行いたいのですが画面に正方形の四角い線が描画されません。これはなぜなのでしょうか?そもそもシェーダーでは出来ないのでしょうか?行列をかける順番や処理の内容を参考サイトを参考によく考えましたがどうしても原因がわかりません。
2
2
 
3
3
 
4
4
  参考サイト: http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/