[解決済み] glm::ortho()は実は間違っている?
質問
最近、OpenGLが提供する行列演算や固定関数パイプラインなどの古い(非推奨)機能から乗り換えるのは良いアイデアだと思いました。
私は、物事を少し単純化するために、GLMを行列ライブラリとして使用しています。問題は、それが単純化するよりも多くの問題を引き起こしているかもしれないことです...。
透視投影は私のシェーダーとセットアップで問題なく動作しましたが、直交投影に切り替えようとしたところ、すべてが崩壊してしまいました。ポイントやシンプルな四角形が表示されないのです。古いOpenGLのマトリクスを使用すると、物事は再び動作し始めました。
その結果、投影行列に行き着いたのです。以下はその呼び方です。
glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );
これを一旦openglが提供する"と比較しました。
glOrtho( 0, 400, 0, 400, -1, 1 );
唯一の違いは [0][0] 要素と [1][1] 要素です (私の知る限り、それぞれ "2/width" と "2/height" に等しいです)。OpenGLの行列から、その値はまさにそれでした! しかし、glmのマトリックスでは、値は0でした。
glm::orthoを呼び出した後、glmマトリックスの値を手動で切り替えると、すべてが再び動作するようになりました!
そこで質問ですが、glm::ortho()関数は本当に壊れているのでしょうか、それとも私の使い方が間違っているだけなのでしょうか?
解決方法は?
ソースコード(v 0.9.3.4)を見る限りでは壊れているはずはないようです
template <typename valType>
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
(
valType const & left,
valType const & right,
valType const & bottom,
valType const & top,
valType const & zNear,
valType const & zFar
)
{
detail::tmat4x4<valType> Result(1);
Result[0][0] = valType(2) / (right - left);
Result[1][1] = valType(2) / (top - bottom);
Result[2][2] = - valType(2) / (zFar - zNear);
Result[3][0] = - (right + left) / (right - left);
Result[3][1] = - (top + bottom) / (top - bottom);
Result[3][2] = - (zFar + zNear) / (zFar - zNear);
return Result;
}
ただひとつ思うのは、このテンプレートは整数の行列を作成しており(関数にすべてのintを渡しているため)、その結果浮動小数点ではなく整数の除算を行っているのではないかということです。そこで
.f
をすべてのパラメータに追加してください。
glm::mat4 projMat = glm::ortho( 0.f, 400.f, 0.f, 400.f, -1.f, 1.f );
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】'cout'は型名ではない
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】'std::cout'への未定義の参照