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

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

新規登録して質問してみよう
ただいま回答率
85.48%
OpenGL

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

C++

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

Q&A

1回答

1768閲覧

【OpenGL】テクスチャマッピングが表示されない

shukrin

総合スコア14

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/02/25 08:09

編集2020/02/25 09:17

###発生している問題
OpenGLを勉強中なのですが困ったことがあり質問させていただきました。
こちらのサイトを参考にテクスチャマッピングを利用して画像を表示するプログラムを作成しようとしているのですが、実行すると真っ白なウインドウが表示されてすぐに強制終了してしまいます。その際コンソールには「Test.exe (プロセス 23860) は、コード -1073741819 で終了しました。」と表示されます。

###コード

C++

1#include <gl/glew.h> 2#include <GLFW/glfw3.h> 3#include <iostream> 4#include <fstream> 5#include <vector> 6 7using namespace std; 8 9const int g_width = 640; 10const int g_height = 480; 11 12GLuint crateShader() 13{ 14 //バーテックスシェーダのコンパイル 15 GLuint vShaderId = glCreateShader(GL_VERTEX_SHADER); 16 string vertexShader = R"#( 17 attribute vec3 position; 18 attribute vec2 uv; 19 varying vec2 vuv; 20 void main(void){ 21 gl_Position = vec4(position, 1.0); 22 vuv = uv; 23 } 24 )#"; 25 const char* vs = vertexShader.c_str(); 26 glShaderSource(vShaderId, 1, &vs, NULL); 27 glCompileShader(vShaderId); 28 29 //フラグメントシェーダのコンパイル 30 GLuint fShaderId = glCreateShader(GL_FRAGMENT_SHADER); 31 string fragmentShader = R"#( 32 varying vec2 vuv; 33 uniform sampler2D texture; 34 void main(void){ 35 gl_FragColor = texture2D(texture, vuv); 36 } 37 )#"; 38 const char* fs = fragmentShader.c_str(); 39 glShaderSource(fShaderId, 1, &fs, NULL); 40 glCompileShader(fShaderId); 41 42 //プログラムオブジェクトの作成 43 GLuint programId = glCreateProgram(); 44 glAttachShader(programId,vShaderId); 45 glAttachShader(programId,fShaderId); 46 47 // リンク 48 glLinkProgram(programId); 49 50 glUseProgram(programId); 51 52 return programId; 53} 54 55GLuint loadTexture(string filename) 56{ 57 // テクスチャIDの生成 58 GLuint texID; 59 glGenTextures(1, &texID); 60 61 // ファイルの読み込み 62 std::ifstream fstr(filename, std::ios::binary); 63 const size_t fileSize = static_cast<size_t>(fstr.seekg(0, fstr.end).tellg()); 64 fstr.seekg(0, fstr.beg); 65 char* textureBuffer = new char[fileSize]; 66 fstr.read(textureBuffer, fileSize); 67 68 // テクスチャをGPUに転送 69 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 70 glBindTexture(GL_TEXTURE_2D, texID); 71 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, textureBuffer); 72 73 // テクスチャの設定 74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 75 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 76 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 77 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 78 79 // テクスチャのアンバインド 80 delete[] textureBuffer; 81 glBindTexture(GL_TEXTURE_2D, 0); 82 83 return texID; 84} 85 86int main() 87{ 88 if( !glfwInit() ){ 89 return -1; 90 } 91 92 GLFWwindow* window = glfwCreateWindow(g_width, g_height, "Simple", NULL, NULL); 93 if (!window) 94 { 95 glfwTerminate(); 96 return -1; 97 } 98 99 // モニタとの同期 100 glfwMakeContextCurrent(window); 101 glfwSwapInterval(1); 102 103 GLuint programId = crateShader(); 104 105 GLuint texID = loadTexture("Lenna.raw"); 106 107 // ゲームループ 108 while (!glfwWindowShouldClose(window)) { 109 110 // 画面の初期化 111 glClearColor(0.2f, 0.2f, 0.2f, 0.0f); 112 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 113 glClearDepth(1.0); 114 115 // 頂点データ 116 float vertex_position[] = { 117 0.5f, 0.5f, 118 -0.5f, 0.5f, 119 -0.5f, -0.5f, 120 0.5f, -0.5f 121 }; 122 123 const GLfloat vertex_uv[] = { 124 1, 0, 125 0, 0, 126 0, 1, 127 1, 1, 128 }; 129 130 // 何番目のattribute変数か 131 int positionLocation = glGetAttribLocation(programId, "position"); 132 int uvLocation = glGetAttribLocation(programId, "uv"); 133 int textureLocation = glGetUniformLocation(programId, "texture"); 134 135 // attribute属性を有効にする 136 glEnableVertexAttribArray(positionLocation); 137 glEnableVertexAttribArray(uvLocation); 138 139 // uniform属性を設定する 140 glUniform1i(textureLocation, 0); 141 142 // attribute属性を登録 143 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, false, 0, vertex_position); 144 glVertexAttribPointer(uvLocation, 2, GL_FLOAT, false, 0, vertex_uv); 145 146 147 // モデルの描画 148 glBindTexture(GL_TEXTURE_2D, texID); 149 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 150 151 // バッファの入れ替え 152 glfwSwapBuffers(window); 153 154 // イベント待ち 155 glfwPollEvents(); 156 } 157 158 glfwTerminate(); 159 160 return 0; 161}

先頭に#include <gl/glew.h>を付け足したことと画像ファイルの名前を変更したこと以外は上記サイトに掲載のコードと全く同じものです。何が原因でこのようなことになっているのか全く見当もつきません。原因に心当たりのある方がいらっしゃったらお助けいただけないでしょうか。
開発環境はVIsual Studio 2019です。

###変更したコード
いただいたアドバイスをもとに上記コードにglewの初期化処理を加えました。

C++

1#include <gl/glew.h> 2#include <GLFW/glfw3.h> 3#include <iostream> 4#include <fstream> 5#include <vector> 6 7using namespace std; 8 9const int g_width = 640; 10const int g_height = 480; 11 12GLuint crateShader() 13{ 14 省略 15} 16 17GLuint loadTexture(string filename) 18{ 19 省略 20} 21 22int main() 23{ 24 if (!glfwInit()) { 25 return -1; 26 } 27 28 GLFWwindow* window = glfwCreateWindow(g_width, g_height, "Simple", NULL, NULL); 29 if (!window) 30 { 31 glfwTerminate(); 32 return -1; 33 } 34 35 // モニタとの同期 36 glfwMakeContextCurrent(window); 37 glfwSwapInterval(1); 38 39 40 //変更箇所------------------------------------ 41 // GLEW初期化 42 if (glewInit() != GLEW_OK) 43 { 44 return -1; 45 } 46 //------------------------------------------- 47 48 GLuint programId = crateShader(); 49 50 GLuint texID = loadTexture("Lenna.raw"); 51 52 // ゲームループ 53 while (!glfwWindowShouldClose(window)) { 54 55 // 画面の初期化 56 glClearColor(0.2f, 0.2f, 0.2f, 0.0f); 57 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 58 glClearDepth(1.0); 59 60 // 頂点データ 61 float vertex_position[] = { 62 0.5f, 0.5f, 63 -0.5f, 0.5f, 64 -0.5f, -0.5f, 65 0.5f, -0.5f 66 }; 67 68 const GLfloat vertex_uv[] = { 69 1, 0, 70 0, 0, 71 0, 1, 72 1, 1, 73 }; 74 75 // 何番目のattribute変数か 76 int positionLocation = glGetAttribLocation(programId, "position"); 77 int uvLocation = glGetAttribLocation(programId, "uv"); 78 int textureLocation = glGetUniformLocation(programId, "texture"); 79 80 // attribute属性を有効にする 81 glEnableVertexAttribArray(positionLocation); 82 glEnableVertexAttribArray(uvLocation); 83 84 // uniform属性を設定する 85 glUniform1i(textureLocation, 0); 86 87 // attribute属性を登録 88 glVertexAttribPointer(positionLocation, 2, GL_FLOAT, false, 0, vertex_position); 89 glVertexAttribPointer(uvLocation, 2, GL_FLOAT, false, 0, vertex_uv); 90 91 92 // モデルの描画 93 glBindTexture(GL_TEXTURE_2D, texID); 94 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 95 96 // バッファの入れ替え 97 glfwSwapBuffers(window); 98 99 // イベント待ち 100 glfwPollEvents(); 101 } 102 103 glfwTerminate(); 104 105 return 0; 106}

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

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

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

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

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

guest

回答1

0

glewの初期化(init関数の実行)がコード内にありません。glewに関する部分を確認するのがよいかと思います。

投稿2020/02/25 08:25

DaMik

総合スコア38

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

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

shukrin

2020/02/25 09:26

ご回答ありがとうございます。いただいたアドバイスをもとにglewの初期化処理を付け加えました。(質問文に変更後のコードを添付しております) しかしこの場合も先ほどと同じように真っ白な画面が一度表示されてすぐに強制終了してしまいます。他に考えられる原因はございませんでしょうか。
DaMik

2020/02/25 13:23

元ソースからの変更点がglewを追加した、画像を変えた、の2点ですので、変更した画像(Lenna.raw)を確認してみてはどうでしょうか。(例えば、元コードのcat.rawを読み込んでできるのかどうかを検証するなど) さらに、そもそもシェーダで簡単な三角形でもいいので描画できないのであれば、シェーダプログラムができていませんので、シェーダを使ったポリゴン描画を先に確認する必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問