私はほとんどの場合、ArchLinuxでゲームを開発しています。最近、Ubuntu16.04で試してみることにしました。私が遭遇した状況は本当に奇妙でした:
-
glGetError()
はまったくありません。 - エラー、警告、悪いことは何もありません。 glデバッグ出力で。
- すべての悪い状況に対して行ったすべてのアサーションはトリガーされませんでした。
-
glClear
はバッファを正常にクリアしました。指定されましたが、: -
glDraw*
は何も描画しませんでした。
幸いなことに解決策を見つけました glViewport
を設定しました。ただし、よくわかりません。Ubuntuで描画する必要があるのに、ArchLinuxでは必要ないのはなぜですか。グラフィックスアダプターの違いもあります。archlinuxではNVIDIA 1060を使用し、Ubuntuでは統合HDグラフィックスP530(Skylake GT 2 。
重要な場合は、opengl4.4でSDL2を使用します。
コメント
- It 'ここではOSが関連していないことを理解することが重要です。OpenGLはGPUベンダーによってドライバーに実装されているため、重要な要素はGPUとそのドライバーです。OSが興味深いのはGPUベンダーがOSごとに異なるコードベースを持っているが、そうでない場合は'有用な情報ではありません。
- @MaximusMinimusこれが質問の答えになる可能性があります。
回答
すでに2つの良い回答がありますが、初心者には理解しにくいかもしれないので、私は「なぜ本当に関数。
通常のレンダリングでは、意味がないように見える場合があります。ウィンドウを作成するか、ターゲットをレンダリングして、その上に描画するだけですよね?アプリの95%以上がそのように機能すると思います。
しかし、ウィンドウを4つの異なるレンダリングに分割する3DSMAXのようなアプリを作成しているとしましょう。現在の分割位置とマウスイベントを管理するため、分割バーにカーソルを合わせると、マウスカーソルをサイズ変更などに変更できます。分割バーをドラッグすると、新しい位置などが記憶されます。
3Dビューをレンダリングする場合は、最初の3Dサブウィンドウの位置とサイズを使用してglViewportを計算し、一般的なGLコマンドを実行してここに描画します。OpenGLは、指定されたビューポートに収まるようにレンダリングを自動的に拡大縮小します。残りのビューポートと最後に、それぞれ独自のパラメータを持ついくつかの異なるレンダリングを含む1つのウィンドウが表示されます。このようにして、単一のウィンドウ/レンダリングターゲットに必要な数の個別のレンダリングを行うことができます。
1台のマシンで機能しなかったのはなぜですか?
GPUとそのドライバには多くの機能があります実装の詳細と違いなので、一般的にはそのような問題に慣れる必要があります。 1つの簡単な例:GLSLシェーダーでは、次のような2Dゼロベクトルを作成できます:vec2(0.0,0.0)
、1つの値を書き込もうとすることもできます:vec2(0.0)
そしてこのコードでは、一部のドライバーはそれを以前のバージョンとして扱いますが、他のドライバーはエラーを返し、何もレンダリングしません。 2つのベンダーのドライバーは、同じドライバーの2つのバージョンよりも異なることに注意してください。したがって、「nVidia、ATI、およびIntel GPUでコードをテストすることをお勧めします。この場合、nVidiaドライバーでは、自分でビューポートを設定しないでください。Intelドライバはそれを行いませんが、レンダリングターゲット全体を使用することを想定しています。
回答
glViewportは、openglにNDC座標をフレームバッファ座標にマップする方法を知らせます。
デフォルトでは、画面バッファのフルサイズに設定されているため、ウィンドウのときにのみ呼び出す必要があります。サイズが変更されるか、実際に変更したい。
コメント
- または、ウィンドウのサイズが異なると仮定して、フレームバッファにレンダリングする場合。
回答
glViewportは、正規化されたデバイス座標からウィンドウ座標へのxxとyyのアフィン変換を指定します。Let(xnd 、ynd)xndyndは正規化されたデバイス座標になりますアンアット。次に、ウィンドウ座標(xw、yw)xwywが次のように計算されます。
- “xw =(xnd + 1)(width2)+ xxw = xnd +1width2+ x”
- “yw =(ynd + 1)(height2)+ yyw = ynd +1height2+ y”
ビューポートの幅と高さは、以下に依存する範囲にサイレントにクランプされます。実装。この範囲をクエリするには、引数「GL_MAX_VIEWPORT_DIMS」を指定してglGetを呼び出します。
xパラメータとyパラメータはビューポートの左下隅をピクセル単位で指定し、widthとheightはビューポートの幅と高さを指定します