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

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

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

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

C++

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

GLSL ES

GLSL ESは、GLSLの派生規格で、 組み込み環境向けのOpenGL ES用のシェーダー言語です。

Q&A

解決済

1回答

1707閲覧

正規化デバイス座標で画面の真ん中に頂点描画ができない。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL ES

GLSL ESは、GLSLの派生規格で、 組み込み環境向けのOpenGL ES用のシェーダー言語です。

0グッド

0クリップ

投稿2020/09/11 10:45

質問ですが、なぜ提示コードの頂点バッファーコメント部のような頂点を与えてもシェーダーで描画しようととすると提示画像のようなバグが発生するのでしょうか?自分は正規化デバイス座標で真ん中に表示するよう頂点座標を正規化デバイス座標で設定しましたこれができないのは異常に変なのですが自分は一体何をしているのでしょか?

glVertex3f();などといった確認用の簡易頂点関数などでの描画ではちゃんと正方形が表示されるためやはり何かおかしいと思うのですがOpenglは初心者ですのでどうしてもわかりません。

イメージ説明

GLSL

1#version 400 2//フラグメントシェーダー 3out vec4 fragment; 4 5void main() 6{ 7 fragment = vec4(0.0,0.0,1.0,1.0); 8 9 10}

GLSL

1#version 400 2//頂点シェーダー 3 4layout(Location = 0) in vec3 position;//頂点座標 5 6 7void main() 8{ 9 gl_Position = vec4( position,1.0); 10} 11 12

cpp

1//シェーダを実装する 2void Game::Shader() 3{ 4 5 6 7//シェーダーの読み込みコードは長くてそれtに必要ないので割愛 8/* 9 10 11*/ 12 13 14 //フラグメントシェーダー 15 glBindAttribLocation(program, 0, "Vertex"); 16 17 //頂点シェーダー 18 glBindAttribLocation(program,1,"Vertex"); 19 20//***************************************************************************** 21 22 glLinkProgram(program); 23 24 //使わなくなったシェーダーオブジェクトを削除 25 glDeleteShader(out_frag); 26 glDeleteShader(out_vert); 27} 28 29 30//初期化 31bool Game::Initialization() 32{ 33 34//////////////////////////////////////////////////////////////////// 35 //頂点バッファー 36/* 37 const GLfloat Vertex[18] = 38 { 39 -0.5, 0.5, 1.0, 40 -0.5, -0.5, 1.0 , 41 +0.5, -0.5, 1.0, 42 43 -0.5, 0.5, 1.0, 44 0.5, 0.5, 1.0 , 45 +0.5, -0.5, 1.0 46 47 48 }; 49*/ 50////////////////////////////////////////////////////////////////// 51 Shader();//シェーダーを読み込む 52 53 glGenVertexArrays(1, &vbo); 54 glBindVertexArray(vbo); 55 glGenBuffers(1,&vbo); 56 glBindBuffer(GL_ARRAY_BUFFER, vbo); 57 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex), Vertex, GL_STATIC_DRAW);/////// 58 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 59 glEnableVertexAttribArray(0); 60 glBindVertexArray(vbo); 61 62 63 64 mIsRunLoop = true; 65 return mIsRunLoop; 66} 67 68//アップデート 69void Game::Update() 70{ 71 72} 73 74//描画アップデート 75void Game::GenerateOutput() 76{ 77 glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 78 glClear(GL_COLOR_BUFFER_BIT); 79 80 glUseProgram(program);//シェーダーを有効にする 81 82 83 glDrawArrays(GL_POLYGON, 0,6); 84 85 glViewport(0,0,WIDTH,HEIGHT); 86} 87

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

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

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

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

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

guest

回答1

0

ベストアンサー

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

頂点シェーダーのpositionがvec3なので、glVertexAttribPointerの第2引数は3ではないでしょうか。

cpp

1#include <gl/glew.h> 2#include <GLFW/glfw3.h> 3#include <fmt/core.h> 4 5bool attachShader(GLuint program, GLenum type, const char* source) 6{ 7 int shader = glCreateShader(type); 8 9 glShaderSource(shader, 1, &source, nullptr); 10 glCompileShader(shader); 11 12 int status = 0; 13 glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 14 if (status == GL_FALSE) 15 { 16 GLchar infoLog[256] = {}; 17 glGetShaderInfoLog(shader, 256, NULL, infoLog); 18 19 fmt::print("Compile error\n{}\n", infoLog); 20 } 21 else 22 { 23 glAttachShader(program, shader); 24 } 25 26 glDeleteShader(shader); 27 28 return status != GL_FALSE; 29} 30 31bool linkProgram(GLuint program) 32{ 33 glLinkProgram(program); 34 35 int status = 0; 36 glGetProgramiv(program, GL_LINK_STATUS, &status); 37 if (status == GL_FALSE) 38 { 39 GLchar infoLog[256] = {}; 40 glGetProgramInfoLog(program, 256, NULL, infoLog); 41 42 fmt::print("Link error\n{}\n", infoLog); 43 } 44 45 return status != GL_FALSE; 46} 47 48GLuint loadProgram(const char* vert, const char* frag) 49{ 50 GLuint program = glCreateProgram(); 51 52 bool bvert = attachShader(program, GL_VERTEX_SHADER, vert); 53 bool bfrag = attachShader(program, GL_FRAGMENT_SHADER, frag); 54 55 if (!(bvert && bfrag)) 56 { 57 glDeleteProgram(program); 58 59 return 0; 60 } 61 62 return linkProgram(program); 63} 64 65int main() 66{ 67 if (glfwInit() == GL_FALSE) 68 { 69 return -1; 70 } 71 72 GLFWwindow* window = glfwCreateWindow(800, 600, "Test", NULL, NULL); 73 if (!window) 74 { 75 return -1; 76 } 77 78 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 79 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); 80 81 glfwMakeContextCurrent(window); 82 glfwSwapInterval(1); 83 84 if (glewInit() != GLEW_OK) 85 { 86 return -1; 87 } 88 89 const char* vert =R"( 90#version 330 core 91 92layout(location = 0) in vec3 position; 93 94void main() 95{ 96 gl_Position = vec4(position, 1.0); 97} 98)"; 99 100 const char* frag = R"( 101#version 330 core 102 103layout(location = 0) out vec4 fragment; 104 105void main() 106{ 107 fragment = vec4(1.0, 0.0, 0.0, 1.0); 108} 109)"; 110 111 auto program = loadProgram(vert, frag); 112 if (program == 0) 113 { 114 return -1; 115 } 116 117 GLuint vbo = 0; 118 119 // 頂点バッファオブジェクト 120 glGenBuffers(1, &vbo); 121 122 struct Vertex 123 { 124 GLfloat position[3]; 125 }; 126 127 Vertex vertices[] = 128 { 129 { -0.5, 0.5, 1.0 }, 130 { -0.5, -0.5, 1.0 }, 131 { +0.5, -0.5, 1.0 }, 132 133 { -0.5, 0.5, 1.0 }, 134 { 0.5, 0.5, 1.0 }, 135 { +0.5, -0.5, 1.0 }, 136 }; 137 138 while (glfwWindowShouldClose(window) == GL_FALSE) 139 { 140 int display_w, display_h; 141 glfwGetFramebufferSize(window, &display_w, &display_h); 142 glViewport(0, 0, display_w, display_h); 143 144 glClearColor(0.2f, 0.2f, 0.3f, 0.0f); 145 glClear(GL_COLOR_BUFFER_BIT); 146 147 glBindBuffer(GL_ARRAY_BUFFER, vbo); 148 glBufferData(GL_ARRAY_BUFFER, _countof(vertices) * sizeof(Vertex), vertices, GL_STREAM_DRAW); 149 150 //glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 151 glVertexAttribPointer(0, _countof(Vertex::position), GL_FLOAT, GL_FALSE, 0, 0); 152 glEnableVertexAttribArray(0); 153 154 glUseProgram(program); 155 156 glDrawArrays(GL_POLYGON, 0, _countof(vertices)); 157 158 glfwSwapBuffers(window); 159 glfwPollEvents(); 160 } 161 162 return 0; 163}

投稿2020/09/12 09:14

mah

総合スコア591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問