質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.92%

OpenGL 3.3 でshaderが読み込めない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 418

DoubleJ794

score 6

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

using namespace glm;

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();
    }

    // ファイルからフラグメントシェーダを読み込みます。
    std::string FragmentShaderCode;
    std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
    if(FragmentShaderStream.is_open()){
        std::stringstream sstr;
        sstr << FragmentShaderStream.rdbuf();
        FragmentShaderCode = sstr.str();
        FragmentShaderStream.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<char> 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<char> 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<char> ProgramErrorMessage(max(InfoLogLength, int(1)));
    glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
    fprintf(stdout, "%sn", &ProgramErrorMessage[0]);

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    return ProgramID;
}

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);

    //ESCキーが押されるまで閉じるのを防ぐ
    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

    //フレームループ
    //ESCが押されたか、Windowが閉じたかをチェックする
    while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == GL_FALSE) {

        //バッファのクリア
        glClearColor(0.2f, 0.2f, 0.2f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        //バッファをスワップする
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/01 19:27

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

    キャンセル

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

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る