🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1881閲覧

OpenGL 3.3 でshaderが読み込めない

DoubleJ794

総合スコア19

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/09/29 05:01

前提・実現したいこと

OpenGLとC++のプログラミングを始めたのですが、shaderをうまく読み込んでくれません。と、いうよりもエラーが発生して実行できません。C++が初めてなため全く知識がなく、どこをどのように修正すればいいのかがわかりません。

発生している問題・エラーメッセージ

エラーメッセージ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 抑制状態 エラー (アクティブ) E0065 ';' が必要です OpenGL-MMD C:\Users\○○\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 45 エラー (アクティブ) E0020 識別子 "VertexShaderCode" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 67 エラー (アクティブ) E0020 識別子 "VertexShaderID" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 68 エラー (アクティブ) E0020 識別子 "Result" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 72 エラー (アクティブ) E0020 識別子 "InfoLogLength" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 73 エラー (アクティブ) E0135 namespace "std" にメンバー "vector" がありません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 74 エラー (アクティブ) E0020 識別子 "fragment_file_path" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 79 エラー (アクティブ) E0020 識別子 "FragmentShaderCode" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 80 エラー (アクティブ) E0020 識別子 "FragmentShaderID" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 81 エラー (アクティブ) E0135 namespace "std" にメンバー "vector" がありません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 87 エラー (アクティブ) E0135 namespace "std" にメンバー "vector" がありません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 101 エラー (アクティブ) E0020 識別子 "max" が定義されていません OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 101 エラー (アクティブ) E0169 宣言が必要です OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 112 エラー (アクティブ) E0169 宣言が必要です OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 127 エラー (アクティブ) E0169 宣言が必要です OpenGL-MMD C:\Users\oo\source\repos\OpenGL-MMD\OpenGL-MMD.cpp 129

該当のソースコード

ソースコード #include "stdio.h" #include "stdlib.h" #include <iostream> #include "packages/glew.1.9.0.1/build/native/include/GL/glew.h" #include "packages/glfw.3.3.0.1/build/native/include/GLFW/glfw3.h" int main() { //GLFW初期化処理 if (!glfwInit()) { fprintf(stderr, "GLFWの初期化に失敗知っちゃったにゃん... n"); return -1; } glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //Windowを開き、OpenGLコンテキストを作成 GLFWwindow* window; window = glfwCreateWindow(1024, 768, "OpenGL-MikuMkikuDance", NULL, NULL); if (window == NULL) { fprintf(stderr, "GLFWウィンドウのオープンに失敗しちゃったにゃん... 現在使用しているPCのGPUのOpenGLのバージョンが4.2以降に対応しているかか確認してほしいにゃん..."); glfwTerminate(); return -1; } //GLFWの初期化処理 glfwMakeContextCurrent(window); glewExperimental = true; if (glewInit() != GLEW_OK) { fprintf(stderr, "GLEWの初期化に失敗しちゃったにゃん... n"); return -1; } GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) { // シェーダを作ります。 GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); // ファイルから頂点シェーダのコードを読み込みます。 std::string VertexShaderCode; std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); if (VertexShaderStream.is_open()) { std::stringstream sstr; sstr << VertexShaderStream.rdbuf(); VertexShaderCode = sstr.str(); VertexShaderStream.close(); } GLint Result = GL_FALSE; int InfoLogLength; // 頂点シェーダをコンパイルします。 printf("Compiling shader : %sn", vertex_file_path); char const* VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL); glCompileShader(VertexShaderID); // 頂点シェーダをチェックします。 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); fprintf(stdout, "%sn", &VertexShaderErrorMessage[0]); // フラグメントシェーダをコンパイルします。 printf("Compiling shader : %sn", fragment_file_path); char const* FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL); glCompileShader(FragmentShaderID); // フラグメントシェーダをチェックします。 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%sn", &FragmentShaderErrorMessage[0]); // プログラムをリンクします。 fprintf(stdout, "Linking programn"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // プログラムをチェックします。 glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector ProgramErrorMessage(max(InfoLogLength, int(1))); glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); fprintf(stdout, "%sn", &ProgramErrorMessage[0]); glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); return ProgramID; } //フレームループ while (glfwWindowShouldClose(window) == GL_FALSE) { //バッファのクリア glClearColor(0.2f, 0.2f, 0.2f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); //バッファをスワップする glfwSwapBuffers(window); glfwPollEvents(); } //ESCキーが押されるまで閉じるのを防ぐ glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); //ESCが押されたか、Windowが閉じたかをチェックする while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); } (http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-2-the-first-triangle/ ,https://codelabo.com/630/ 参考)

試したこと

まったく分からなかったので、対処法の検索(下手にいじるとさらにややこしいことになりそうなので...)

補足情報(FW/ツールのバージョンなど)

VisualStudio 2019

glew ver.1.9.0.1

glfw ver.3.3.0.1

glm ver.0.9.9.600

nupengl ver.1.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私はC++の知識が乏しく、素人が泥縄的に検索しての回答になりますがご容赦ください...

どうやらインクルードするべきファイルが不足しているらしいのと、std::vectorの型パラメーターが不足しているらしい点が見られました。
おそらくopengl-tutorialをご参考にされたのかと思いますが、どうも日本語版のサンプルコード部分で山カッコを含む部分が欠落してしまうという不備があるようです。適宜サイト右上の言語設定を「english」に切り替えて、英語版のコードも確認しながらお読みいただくのがいいんじゃないかと思います。

C++

1#include <stdio.h> 2#include <stdlib.h> 3#include <GL/glew.h> 4#include <GLFW/glfw3.h> 5#include <glm/glm.hpp> 6#include <string> 7#include <iostream> 8#include <fstream> 9#include <sstream> 10#include <vector> 11 12using namespace glm; 13 14GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) { 15 16 // シェーダを作ります。 17 GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); 18 GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); 19 20 // ファイルから頂点シェーダのコードを読み込みます。 21 std::string VertexShaderCode; 22 std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); 23 if (VertexShaderStream.is_open()) 24 { 25 std::stringstream sstr; 26 sstr << VertexShaderStream.rdbuf(); 27 VertexShaderCode = sstr.str(); 28 VertexShaderStream.close(); 29 } 30 31 // ファイルからフラグメントシェーダを読み込みます。 32 std::string FragmentShaderCode; 33 std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); 34 if(FragmentShaderStream.is_open()){ 35 std::stringstream sstr; 36 sstr << FragmentShaderStream.rdbuf(); 37 FragmentShaderCode = sstr.str(); 38 FragmentShaderStream.close(); 39 } 40 41 GLint Result = GL_FALSE; 42 int InfoLogLength; 43 44 // 頂点シェーダをコンパイルします。 45 printf("Compiling shader : %sn", vertex_file_path); 46 char const* VertexSourcePointer = VertexShaderCode.c_str(); 47 glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL); 48 glCompileShader(VertexShaderID); 49 50 // 頂点シェーダをチェックします。 51 glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); 52 glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 53 std::vector<char> VertexShaderErrorMessage(InfoLogLength); 54 glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); 55 fprintf(stdout, "%sn", &VertexShaderErrorMessage[0]); 56 57 // フラグメントシェーダをコンパイルします。 58 printf("Compiling shader : %sn", fragment_file_path); 59 char const* FragmentSourcePointer = FragmentShaderCode.c_str(); 60 glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL); 61 glCompileShader(FragmentShaderID); 62 63 // フラグメントシェーダをチェックします。 64 glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); 65 glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); 66 std::vector<char> FragmentShaderErrorMessage(InfoLogLength); 67 glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); 68 fprintf(stdout, "%sn", &FragmentShaderErrorMessage[0]); 69 70 // プログラムをリンクします。 71 fprintf(stdout, "Linking programn"); 72 GLuint ProgramID = glCreateProgram(); 73 glAttachShader(ProgramID, VertexShaderID); 74 glAttachShader(ProgramID, FragmentShaderID); 75 glLinkProgram(ProgramID); 76 77 // プログラムをチェックします。 78 glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); 79 glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); 80 std::vector<char> ProgramErrorMessage(max(InfoLogLength, int(1))); 81 glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); 82 fprintf(stdout, "%sn", &ProgramErrorMessage[0]); 83 84 glDeleteShader(VertexShaderID); 85 glDeleteShader(FragmentShaderID); 86 87 return ProgramID; 88} 89 90int main() { 91 //GLFW初期化処理 92 if (!glfwInit()) { 93 fprintf(stderr, "GLFWの初期化に失敗しちゃったにゃん... n"); 94 return -1; 95 } 96 97 glfwWindowHint(GLFW_SAMPLES, 4); 98 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 99 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 100 101 //Windowを開き、OpenGLコンテキストを作成 102 GLFWwindow* window; 103 window = glfwCreateWindow(1024, 768, "OpenGL-MikuMkikuDance", NULL, NULL); 104 if (window == NULL) { 105 fprintf(stderr, "GLFWウィンドウのオープンに失敗しちゃったにゃん... 現在使用しているPCのGPUのOpenGLのバージョンが4.2以降に対応しているかか確認してほしいにゃん..."); 106 glfwTerminate(); 107 return -1; 108 } 109 110 //GLFWの初期化処理 111 glfwMakeContextCurrent(window); 112 113 glewExperimental = true; 114 115 if (glewInit() != GLEW_OK) { 116 fprintf(stderr, "GLEWの初期化に失敗しちゃったにゃん... n"); 117 return -1; 118 } 119 120 GLuint VertexArrayID; 121 glGenVertexArrays(1, &VertexArrayID); 122 glBindVertexArray(VertexArrayID); 123 124 //ESCキーが押されるまで閉じるのを防ぐ 125 glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); 126 127 //フレームループ 128 //ESCが押されたか、Windowが閉じたかをチェックする 129 while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == GL_FALSE) { 130 131 //バッファのクリア 132 glClearColor(0.2f, 0.2f, 0.2f, 0.0f); 133 glClear(GL_COLOR_BUFFER_BIT); 134 135 //バッファをスワップする 136 glfwSwapBuffers(window); 137 glfwPollEvents(); 138 } 139}

投稿2019/09/30 20:17

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DoubleJ794

2019/10/01 10:27

エラーがなくなりました!!これからは日本語版と英語版を見比べながら基礎を学んでいきます!!本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問