タグ付けされた質問 「opengl」

OpenGLは、デスクトップおよびワークステーション市場を対象とするグラフィック標準およびAPIです。専用のコンピューターハードウェアで簡単に加速できるように設計されているため、ほとんどの実装では、従来のソフトウェアレンダリングよりもパフォーマンスが大幅に向上しています。現在、OpenGLはCADソフトウェアやコンピューターゲームなどのアプリケーションに使用されています。また、クロスプラットフォームです。OpenGL標準は、OpenGL ESも制御するKhronosグループによって制御されています。

1
GLSL:floatをintにキャストするにはどうすればよいですか?
GLSLフラグメントシェーダーで、にキャストしようとしfloatていintます。コンパイラはエラーを発生させます: ERROR: 0:60: '=' : cannot convert from 'mediump float' to 'highp int' の精度を上げてみましたint: mediump float indexf = floor(2.0 * mixer); highp int index = indexf; しかし、無駄に。 どうすればint適切にキャストできますか?
40 opengl  glsl  opengl-es 

5
サイズが2の累乗でないテクスチャを使用する必要がありますか?
OpenGLとDirectXの初期の頃、テクスチャサイズは2のべき乗である必要がありました。これは、シフトなどを使用して、フロート値の補間を非常に迅速に実行できることを意味していました。 OpenGL 2.0(およびその前の拡張機能)以降、2のべき乗以外のテクスチャディメンションがサポートされています。 2のべき乗のテクスチャは、最新の統合されたディスクリートGPUでパフォーマンス上の利点がありますか?2のべき乗以外のテクスチャにはどのような利点がありますか? かなりのデスクトップ人口に、2のべき乗以外のテクスチャをサポートするカードがありますか?

6
OpenGLでレトロスタイルのパレットスワッピングエフェクトを作成する
実行時に特定のピクセルの色を変更する必要がある、メガマンのようなゲームに取り組んでいます。参考:メガマンでは、選択した武器を変更すると、メインキャラクターのパレットが選択した武器を反映するように変更されます。スプライトのすべての色が変化するわけではなく、特定の色のみが変化します。 プログラマーはパレットと、ピクセルとパレットインデックス間の論理マッピングにアクセスできるため、この種の効果はNESで一般的であり、非常に簡単に実行できました。ただし、最新のハードウェアでは、パレットの概念が同じではないため、これはもう少し困難です。 テクスチャはすべて32ビットであり、パレットを使用しません。 私が望む効果を達成するために知っている2つの方法がありますが、この効果を簡単に達成するより良い方法があるかどうか興味があります。私が知っている2つのオプションは次のとおりです。 シェーダーを使用してGLSLを記述し、「パレット交換」動作を実行します。 シェーダーが利用できない場合(たとえば、グラフィックカードがサポートしていないため)、「オリジナル」テクスチャのクローンを作成し、色の変更が事前に適用された異なるバージョンを生成することができます。 理想的には、シェーダーを使用したいと思います。シェーダーは簡単に見えるため、テクスチャの複製方法とは対照的に追加作業がほとんど必要ないためです。テクスチャを複製して色を変更するだけでVRAMが無駄になるのではないかと心配しています。心配する必要はありませんか? 編集:私は最終的に受け入れられた答えのテクニックを使用することになり、これは参考のために私のシェーダーです。 uniform sampler2D texture; uniform sampler2D colorTable; uniform float paletteIndex; void main() { vec2 pos = gl_TexCoord[0].xy; vec4 color = texture2D(texture, pos); vec2 index = vec2(color.r + paletteIndex, 0); vec4 indexedColor = texture2D(colorTable, index); gl_FragColor = indexedColor; } 両方のテクスチャは32ビットであり、1つのテクスチャはすべて同じサイズ(私の場合は6色)であるいくつかのパレットを含むルックアップテーブルとして使用されます。ソーステーブルの赤チャンネルをカラーテーブルのインデックスとして使用します。これは、メガマンのようなパレット交換を実現するための魅力のように機能しました!


4
OpenGLの頂点配列オブジェクトの目的は何ですか?
OpenGLを始めたばかりですが、Vertex配列オブジェクトとは何か、どのように使用できるかをまだよく理解していません。 頂点バッファオブジェクトを使用して頂点データ(位置やテクスチャ座標など)を保存し、VAOにステータスフラグのみが含まれている場合、どこで使用できますか?彼らの目的は何ですか? (非常に不完全で不明瞭な)GL Wikiから理解した限りでは、VAOは、要素配列バッファーで説明されている順序に従って、すべての頂点にフラグ/状態を設定するために使用されますが、Wikiについては本当にあいまいでしたVAOが実際に何をするのか、そしてどのようにそれらを採用できるのか、本当によくわからない。
36 opengl 

7
ボクセル/マインクラフトタイプのゲームのレンダリング速度を改善するにはどうすればよいですか?
Minecraftの独自のクローンを作成しています(Javaで作成されています)。今はうまく機能します。40メートルの視聴距離で、MacBook Pro 8,1で60 FPSを簡単に達成できます。(Intel i5 + Intel HD Graphics 3000)。しかし、視距離を70メートルにすると、15〜25 FPSにしか達しません。実際のMinecraftでは、問題なく遠方(= 256m)に表示距離を置くことができます。だから私の質問は、ゲームをより良くするために何をすべきですか? 私が実装した最適化: ローカルチャンクのみをメモリに保持します(プレーヤーの視聴距離に応じて) 錐台カリング(最初にチャンクで、次にブロックで) ブロックの実際に見える面のみを描く 可視ブロックを含むチャンクごとのリストを使用します。表示されるチャンクは、このリストに追加されます。それらが非表示になると、このリストから自動的に削除されます。ブロックは、隣接するブロックを構築または破壊することにより、見えなくなります。 更新ブロックを含むチャンクごとのリストを使用します。表示可能なブロックリストと同じメカニズム。 newゲームループ内ではステートメントをほとんど使用しません。(私のゲームは、ガベージコレクターが呼び出されるまで約20秒実行されます) 現在、OpenGL呼び出しリストを使用しています。(glNewList()、glEndList()、glCallList())ブロックの種類の各側に。 現在、私は照明システムを使用していません。私はすでにVBOについて聞いたことがあります。しかし、私はそれが何であるかを正確に知りません。ただし、それらについてはいくつか調査します。パフォーマンスが向上しますか?VBOを実装する前にglCallLists()、呼び出しリストのリストを使用して渡したいと思います。代わりに千回使用しglCallList()ます。(実際のMineCraftはVBOを使用していないと思うので、これを試してみたいと思います。正しいですか?) パフォーマンスを改善する他のトリックはありますか? VisualVMプロファイリングはこれを私に示しました(わずか70フレームのプロファイリング、70メートルの視聴距離): 40メートル(246フレーム)のプロファイリング: 注:別のスレッドでチャンクを生成しているため、多くのメソッドとコードブロックを同期しています。ゲームループでこれを行う場合、オブジェクトのロックを取得することはパフォーマンスの問題だと思います(もちろん、ゲームループのみがあり、新しいチャンクが生成されない時間について話します)。これは正解? 編集:いくつかのsynchronisedブロックといくつかの他の小さな改善を削除した後。パフォーマンスはすでにはるかに優れています。70メートルの新しいプロファイリング結果は次のとおりです。 それがselectVisibleBlocksここの問題であることはかなり明らかだと思います。 前もって感謝します! マルティン 更新:いくつかの追加の改善(for eachの代わりにforループを使用する、ループ外で変数をバッファリングするなど)後、60の距離を表示できるようになりました。 できるだけ早くVBOを実装するつもりだと思います。 PS:すべてのソースコードはGitHubで入手できます:https : //github.com/mcourteaux/CraftMania

5
OpenGLでたくさんのタイルを描く、最新の方法
私は小さなタイル/スプライトベースのPCゲームをチームで作業していますが、パフォーマンスの問題に直面しています。前回OpenGLを使用したのは2004年頃でしたので、コアプロファイルの使用方法を自分で教えてきましたが、少し混乱しているように感じます。 フレームごとに250〜750の48x48タイルと、約50のスプライトを画面に描画する必要があります。タイルは新しいレベルがロードされたときにのみ変化し、スプライトは常に変化しています。タイルの一部は4つの24x24ピースで構成されており、ほとんどの(ただしすべてではない)スプライトはタイルと同じサイズです。多くのタイルとスプライトはアルファブレンディングを使用します。 現在、私はこれらすべてを即時モードで行っていますが、これは悪い考えです。それでも同じように、チームメンバーの1人がそれを実行しようとすると、非常に悪いフレームレート(〜20-30 fps)を取得します。さらに多くのタイルがある場合、特にこれらのタイルの多くが切り分けられます。これはすべて、私が問題が行われている描画呼び出しの数であると思うようになります。 私はこれに対するいくつかの可能な解決策を考えましたが、私は愚かなことに時間を無駄にしないように、彼らが話していることを知っている一部の人々によってそれらを実行したかったです: タイル: レベルがロードされたら、すべてのタイルを一度大きなホーンテクスチャにアタッチされたフレームバッファに描画し、各フレーム上にそのテクスチャを含む大きな長方形を描画します。 レベルがロードされたら、すべてのタイルを静的な頂点バッファーに入れて、そのように描画します。glDrawElementsを1回呼び出すだけで、異なるテクスチャのオブジェクトを描画する方法があるのか​​、それとも私がやりたいことなのかわかりません。たぶん、すべてのタイルを大きな巨大なテクスチャに配置し、VBOで面白いテクスチャ座標を使用しますか? スプライト: glDrawElementsを個別に呼び出して、各スプライトを描画します。これには多くのテクスチャ切り替えが関係しているようですが、これは悪いと言われています。ここでテクスチャ配列は便利でしょうか? 動的VBOを何らかの方法で使用します。上記の番号2と同じテクスチャの質問。 ポイントスプライト?これはおそらくばかげています。 これらのアイデアのいずれかが理にかなっていますか?私が見渡せるどこかに良い実装はありますか?
35 opengl 

10
ゲームの見栄えを良くするものは何ですか?[閉まっている]
私はOpenGLとC ++を使用して3Dスペースゲームに取り組んでおり、ゲームをモダンで目を引くグラフィックスを提供することに集中する予定ですが、グラフィックスを作るものが本当にわからないことを理解するほど"良い"。確かに、私は行くと驚くほど一緒に入れグラフィックスでいくつかのよく知られたAAAゲームやバスクを果たしたが、私は本当に知らないことができますどのようにグラフィックスが良いに見えます。(これがゲームを芸術だと考える理由です!) これは私が今考えることができるものです: 高品質のテクスチャ 高品質モデル 良い照明モデル バンプマッピング+鏡面反射マッピング 高品質のUI(該当する場合) やり過ぎのないポストエフェクトが豊富 ここでは、ゲームを制作し、ゲームの内外でどのように機能するかを知っている経験豊富なゲーム開発者に、ゲームのグラフィックスが「良い」ように見えるテクニックと、あまり知られていない風変わりなヒントを説明できることを期待しています。それは素晴らしいことです。 ありがとう!
34 opengl  3d  graphics 

5
glScissorの目的は何ですか?
私はそれがステンシルテストよりも効率的であることを知っていますが、ビューポートで投影変換を使用して同じ機能を達成できると仮定していますか?
32 opengl  opengl-es 

2
OpenGLでゲームループを構築する良い方法
現在、私は学校でOpenGLを学び始めており、先日(学校ではなく自分で)簡単なゲームを作り始めました。私はfreeglutを使用しており、Cで構築しているため、ゲームループでは、渡された関数を使用して、glutIdleFuncすべての描画と物理を1回のパスで更新していました。これは、フレームレートをあまり気にしないシンプルなアニメーションでは問題ありませんでしたが、ゲームはほとんど物理ベースであるため、更新の速度を抑える必要があります。 そのため、私の最初の試みは、関数をglutIdleFunc(myIdle())に渡して、前回の呼び出しから経過した時間を追跡し、物理(および現在のグラフィックス)を数ミリ秒ごとに更新することでした。timeGetTime()(これを使用して)これを実行していました<windows.h>。そして、これは私に考えさせられました、アイドル機能を使用することは本当にゲームループを進める良い方法ですか? 私の質問は、OpenGLでゲームループを実装するより良い方法は何ですか?アイドル機能の使用を避けるべきですか?
31 opengl  c  game-loop 


9
OpenGLの勉強を続けるか、DirectXに切り替えてゲーム業界に就職するチャンスを増やすべきですか?[閉まっている]
OpenGLとLinuxを使用してグラフィックプログラミングを学んでいます。私はほとんどの概念にかなり精通していますが、私の知識をさらに深め、最終的にはゲーム開発、特にゲームエンジン開発のキャリアを追求したいと思います。 これまでのところ、ほとんどのゲームスタジオはDirectXを使用してWindows用のゲームを作成しているようです。 編集:OpenGL対DirectXの質問が以前ここで尋ねられたことは知っていますが、私が望む視点で答えが見つかりませんでした。 編集2:すべての応答/コメントを読んだ後、OpenGL / GLSLを使用してグラフィックスをさらに掘り下げていくことにしましたが、APIの基本を理解するために、DXでも試してみます。あなたが私に与えてくれた答えと洞察に感謝します。


2
Androidゲームで使用するスレッドの数はいくつですか?
少なくとも、OpenGL AndroidゲームにはUIスレッドとによって作成されたレンダラースレッドがありGLSurfaceViewます。 Renderer.onDrawFrame()最大のFPSを取得するために最小限の作業を行う必要があります。物理学、AIなどはすべてのフレームを実行する必要はないため、それらを別のスレッドに入れることができます。今、私たちは持っています: レンダラースレッド-アニメーションの更新とポリゴンの描画 ゲームスレッド-ロジックと定期的な物理学、AIなどの更新 UIスレッド-Android UI相互作用のみ UIスレッドをブロックしたくないので、ゲームロジック用にもう1つのスレッドを実行します。たぶんそれは必要ないでしょうか?レンダラースレッドでゲームロジックを実行する理由はありますか?

4
プログラム可能なパイプライン(GLSL)が固定パイプラインよりも高速なのはなぜですか?
だから私は自分自身にGLSLを教えており、なぜそれが固定機能パイプラインよりも高速であると思われるのかを解明しようとしています。 私が問題を抱えている理由は、私の理解から、あなたが作成するシェーダーは以前に存在したパイプラインのセクションを置き換えているからです。それでは、物事をスピードアップする独自のバージョンを提供するだけではどうでしょうか? 私が考えることができる唯一のことは、以前に独自の照明方程式を提供しようとした場合、CPUで計算を行う必要がありますが、GPUで計算を行うことができ、より高速になります。 これを正しく理解していますか?
27 opengl  glsl 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.