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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

Q&A

解決済

2回答

1855閲覧

opengl 頂点座標は正しいのに描画されない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

0グッド

0クリップ

投稿2021/10/15 05:23

編集2021/10/15 10:59

提示コードですが、 objファイルをロードして描画させたいのですがモデルが表示されません。カメラの問題だと思うのですが提示サイト通りやっても描画されません。

確認した事

頂点データを格納している変数の中身を表示して確認
正射型による2D描画できている
カメラの視点を動かして上下左右に動かし描画されているかどうかを確認
デバッグ表示部のコードで上が頂点座標、下が回転、平行移動、スケール。した後の頂点座標

Github

https://github.com/Shigurechan/GL

参考サイト

参考サイト:http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/#%E5%A4%89%E6%8F%9B%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B

デバッグ表示
$ ./GL 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 -1.000000 1.000000 1.000000 -1.000000 1.000000 1.000000 1.000000 -1.000000 -1.000000 -1.000000 -1.000000 1.000000 -1.000000 1.000000 1.000000 -1.000000 7.500000 10.000000 59.801193 60.000000 -7.500000 10.000000 59.801193 60.000000 -7.500000 10.000000 39.800797 40.000000 7.500000 -10.000000 39.800797 40.000000 7.500000 10.000000 39.800797 40.000000 -7.500000 10.000000 39.800797 40.000000 -7.500000 -10.000000 39.800797 40.000000 -7.500000 10.000000 39.800797 40.000000 -7.500000 10.000000 59.801193 60.000000 -7.500000 -10.000000 59.801193 60.000000 7.500000 -10.000000 59.801193 60.000000 7.500000 -10.000000 39.800797 40.000000 7.500000 -10.000000 59.801193 60.000000 7.500000 10.000000 59.801193 60.000000 7.500000 10.000000 39.800797 40.000000 -7.500000 -10.000000 59.801193 60.000000 -7.500000 10.000000 59.801193 60.000000 7.500000 10.000000 59.801193 60.000000
camera
std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::vertex = std::make_shared<std::vector<FrameWork::D2::VertexAttribute>>(0); //頂点配列 glm::mat4 FrameWork::Camera::scale = glm::mat4(); //拡大縮小 glm::mat4 FrameWork::Camera::rotate = glm::mat4(); //回転 glm::mat4 FrameWork::Camera::translate = glm::mat4(); //平行移動 //描画行列 glm::vec3 FrameWork::Camera::position = glm::vec3(0,0,0); //座標 glm::vec3 FrameWork::Camera::vecLook = glm::vec3(0,0,-1); //向き(視線) glm::mat4 FrameWork::Camera::view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列 glm::mat4 FrameWork::Camera::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形行列 // ##################################### 初期化 ##################################### void FrameWork::Camera::Init() { vertex->resize(6); //頂点配列を初期化 } // ##################################### 頂点属性を取得 ##################################### std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::getVertexAttribute() { return vertex; } // ##################################### 座標を設定 ##################################### void FrameWork::Camera::setPosition(glm::vec3 p) { position = p; //座標 } // ##################################### 視線を設定 ##################################### void FrameWork::Camera::setLook(glm::vec3 l) { vecLook = l; //向き view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); } // ##################################### 座標を取得 ##################################### glm::vec3 FrameWork::Camera::getPosition() { return position; } // ##################################### 視線を取得 ##################################### glm::vec3 FrameWork::Camera::getLook() { return vecLook; } // ##################################### 3D ビュー行列を取得 透視射形行列 ##################################### glm::mat4 FrameWork::Camera::getViewProjection() { return projection * view; } // ##################################### 2D ビュー行列を取得 正射形 ##################################### glm::mat4 FrameWork::Camera::getProjection_2D() { return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f); } // ###################### デストラクタ ###################### FrameWork::Camera::~Camera() { }
.vert
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require layout(location = 0) in vec3 vertexPosition; //layout(location = 1) in vec2 vertexUV; //layout(location = 2) in vec3 vertexNormal; //layout(location = 3) out vec2 vUV; layout(location = 1) out vec4 vFragment; //layout(location = 4) out vec3 vNormal; uniform mat4 uTranslate; uniform mat4 uRotate; uniform mat4 uScale; uniform mat4 uViewProjection; uniform vec4 uFragment; void main() { vec4 vertex = vec4(vertexPosition,1.0); mat4 model = uTranslate * uRotate * uScale; gl_Position = (uViewProjection * model) * vertex; // vUV = vertexUV; vFragment = uFragment; // vNormal = vertexNormal; }
.frag
/*######################################################################### # ###########################################################################*/ #version 420 //#extension GL_ARB_explicit_uniform_location : require //layout(location = 3) in vec2 vUV; layout(location = 1) in vec4 vfragment; //layout(location = 4) in vec3 vNormal; //uniform sampler2D uImage; out vec4 fragment; void main() { fragment = vfragment; // fragment = texture(uImage,vUV); }
Object.cpp
FrameWork::D3::Object::Object(ObjFile o) : Render() { obj = o; //オブジェクトファイル shader->Input(FrameWork::LoadShader("Shader/3D/BasicMono_3D.vert")->data(), FrameWork::LoadShader("Shader/3D/BasicMono_3D.frag")->data()); // printf("%d\n",obj.vertex.size()); //頂点 GLint attrib = shader->getAttribLocation("vertexPosition"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, obj.vertex.size() * sizeof(VertexAttribute), obj.vertex.data(), GL_STATIC_DRAW); glVertexAttribPointer(attrib, 1, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0); shader->setBindAttribLocation("vertexPosition"); //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } void FrameWork::D3::Object::Renderer() { shader->setEnable(); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * obj.vertex.size(), obj.vertex.data()); //Transform setPosition(glm::vec3(0,0,-50)); //座標 setScale(glm::vec3(100,100,100)); //スケール setRotate(glm::vec3(0,0,0),0); //回転 //描画 shader->setUniformMatrix4fv("uTranslate",getMatTranslation()); shader->setUniformMatrix4fv("uRotate", getMatRotate()); shader->setUniformMatrix4fv("uScale", getMatScale()); shader->setUniform4f("uFragment", GetGlColor(glm::vec4(0,255,0,255))); shader->setUniformMatrix4fv("uViewProjection", FrameWork::Camera::getViewProjection()); glDrawArrays(GL_TRIANGLES, 0, obj.vertex.size()); //描画 //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); shader->setDisable(); } FrameWork::D3::Object::~Object() { }
Main.cpp
int main() { FrameWork::Init(glm::ivec2(800, 600), glm::ivec2(4,2), "FrameWork"); // 初期化 FrameWork::Camera::Init(); //カメラ初期化 FrameWork::ObjFile file; FrameWork::D3::LoadObj("Model/test.obj",file); FrameWork::D3::Object object(file); float y = 0; float x = 0; while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255)); if(FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) { x += 0.01; printf("left\n"); printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) { x += -0.01; printf("right\n"); printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) { y += 0.01; printf("up\n"); printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) { y += -0.01; printf("down\n"); printf("%f , %f \n",x,y); } FrameWork::Camera::setLook(glm::vec3(x,y,-1)); FrameWork::Camera::setPosition(glm::vec3(0,0,50)); object.Renderer(); FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

RenderDocのキャプチャ

上の画像はRenderDocのキャプチャです。
gl_PositionにNaNが入ってしまっているのは回転行列のデータがおかしいようです。
それから頂点バッファのデータを見るとvertexPositionが一次元になってしまってます。
これはVertexArrayに頂点属性の構造をセットするあたりの問題だと思います。

投稿2021/10/15 12:53

tkaaad97

総合スコア64

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

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

0

デバッグ表示

とだけ書かれても,何を表示したものなのか? すら謎なのですが,
これが objファイル から読み込んだ素の頂点座標値なのだと仮定しよう.(頂点は18個ということか)

で,FrameWork::D3::Object::Renderer() を見るに,
これらの素の座標がそのまま用いられるのではなくて,

setPosition(glm::vec3(0,0,-50)); //座標
setScale(glm::vec3(100,100,100)); //スケール

という変換が行われるように見える.
では,変換後の座標はどうなっているのか? 例えば,最初の頂点

1.000000 1.000000 -1.000000

は,(100, 100, -150) となるのであろうか.


次,main() 内にある

FrameWork::Camera::setLook(glm::vec3(0,0,-1));
FrameWork::Camera::setPosition(glm::vec3(0,0,50));

という記述は,どういう効果を生むのか?
常識的に考えると,

  • 視点の位置が (0,0,50) で,
  • そこから (0,0,-1)の方向を見るぜ

という意味か.
じゃあ視野の設定はどうなってるのか?

glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f);

これがその設定なのか?
画角が90度で,nearが0.1で,farが100 ってことか?

だとしたら,見えている範囲は,

  • X,Y はfar平面位置でも±100まで.(当然,それよりも手間はもっと狭い)
  • Z は, (near側)49.9 ~ -50(far側) まで.

ということになりそうだ.


以上が正しければ

  • 18個の頂点の素の(X,Y)はいずれも絶対値が1だから,far平面上に無い限りは視野範囲外.
  • 18個の頂点の素のZはいずれも絶対値1だから,その変換後の座標は -150 か 50 のいずれかとなり,視野範囲外.

というわけで,とりあえず18個の頂点は全て視野の外にあるのではなかろうか.
確認されたい.

投稿2021/10/15 07:52

fana

総合スコア11634

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

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

fana

2021/10/15 07:58

回答内に示した思考過程は「例」だと思っていただきたい(多分に想像を含むので,数値などは実情とは異なっているかもしれない) この回答の趣旨は,最後の1行 「確認されたい」 にある. すなわち, 「このように,何がどうなっているのか? というのを自身で検算する」ということを行ってください. (質問するよりも前に!) …っていう話です. あなたの手元にはいくらでもdebugできる状態のコードがあり,各種マトリクスも glm::mat4 みたいな型で存在しているのだから,変換後の座標 みたいなのをCPUサイドで計算させてみることも容易であるはずなのだから.
退会済みユーザー

退会済みユーザー

2021/10/15 08:15

ありがとうございます。カメラを上下左右に回転させてどこかに描画されていないか確認したのですが描画されていません。
fana

2021/10/15 08:27

我は「検算せよ」と申しておるのですぞ. バーテックスシェーダの計算内容をそのままCPUで実施して結果を見ればよいのではありませんかな?
退会済みユーザー

退会済みユーザー

2021/10/15 08:53

頂点シェーダーの中身をそのまま計算して回転部が原因でnan になっていたのでそれを修正して来るべき値になったのですが画面に表示されません。これはなぜでしょうか? glm::vec4 vertex = glm::vec4(1.0f,1.0f,1.0f,1.0f); glm::mat4 model = getMatTranslation() * getMatRotate() * getMatScale(); //glm::vec4 v = (getMatRotate() * vertex); //glm::vec4 v = (getMatRotate() * vertex); //glm::vec4 v = (getMatScale() * vertex); glm::vec4 v = (FrameWork::Camera::getViewProjection() * model) * vertex; printf("%f %f %f %f\n",v.x,v.y,v.z,v.w); // ##################################### 回転 設定 ##################################### void FrameWork::D3::Transform::setRotate(glm::vec3 vec,float r) { rotateAngle = r; rotateVector = vec; //matRotate = glm::rotate(glm::mat4(1), glm::degrees(r), glm::vec3(0.0, 0.0, 0.0)); matRotate = glm::rotate(glm::degrees(r), vec); //matRotate = glm::toMat4(qu); }
fana

2021/10/15 09:10 編集

> 来るべき値 とは何か? (どんな値になれば良いと考えていて,それに対して実際の検算結果値はどうなったのか?)
退会済みユーザー

退会済みユーザー

2021/10/15 09:16

Z 軸が-50で来るZ軸の値が283なのでまだ何か間違えているのですが。これはどうやってデバッグすればいいのでしょうか?
fana

2021/10/15 09:33

正直何言ってるかわからないのだけど, ・objファイルからのデータ読込自体は正常にできていて, ・シェーダに与える直前の各マトリクスの要素値が全てあなたの想定通りであることが確認できていて, ・バーテックスシェーダと同内容の演算をしてみたら 妥当な範囲(=OpenCV的に表示されることになる範囲)に入らない ということが確認できた …のであれば,「表示されない」のがプログラムの正常な動作結果だという話なんじゃないの? つーことは, 表示されない理由は 【オブジェクトを「見えないように」配置していたから】ってことだろうから, だったら 配置(拡大,並進,回転)の具合を「見えるように」直すだけの話なんじゃないの?
fana

2021/10/15 09:38 編集

先に言っとくけど, ここまでの確認ができるならば,その時点で, 「配置(拡大,並進,回転)をどのようにすれば見えるハズなのか」ってのは自明であるハズ. ・カメラの真正面に, ・near~far の範囲に収まるようなサイズで 置いてみたらいいじゃない.
fana

2021/10/15 09:40

少なくとも私なら > 画角が90度で,nearが0.1で,farが100 みたいな話のときに, いきなり「一辺の長さが200の立方体」みたいな物で動作確認しようとは考えないけどなぁ.
退会済みユーザー

退会済みユーザー

2021/10/15 09:46

なるほど。スケールを10にしましたがそれでも画面に表示されません。また物体が-z 50でカメラが(0,0,0) の座標にしたのですがそれでも描画されません。各行列の値を確認しました。
fana

2021/10/15 10:12

自信を持って「表示されるハズ」と言える設定値とデータとを揃えているにも関わらず描画されない,という話なのであれば, ・シェーダにデータを正常に転送できていない ・そもそもシェーダが動いてない 等を疑うべきかもしれない. 頂点データを(これまであなたが表示に成功してきた信頼ある方法で)シェーダに与えてみては? (objファイルがどうのいう話に一切絡まないもう一つのオブジェクトを同時に描画対象とする.→そっちだけが描画されるのかどうか)
fana

2021/10/15 10:17 編集

(つーか,大抵は,空間を把握しやすくするために座標軸だとか地面みたいなのとかいうような補助表示を行うと思うのだが,そういうの無いの?) (無いならこの期に用意したほうがいいのでは…)
退会済みユーザー

退会済みユーザー

2021/10/15 10:30 編集

そもそも描画されないため。3D自体が不可です。2Dでは正射刑による描画で スプライト描画ができるためそれを使って描画したのですが描画されません。また2Dは描画されます。また。座標直に書いて三角形を描画しようとしましが描画されません。
退会済みユーザー

退会済みユーザー

2021/10/15 11:01

またglGetError()を取っているのでのですが何も表示されないので問題無いと思わます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問