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

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

1
プログラムで球の中央半分を描く
球の真ん中半分を作成しようとしています。基本的には球を作成するために、スタック番号とスライス番号が与えられ、2つの変数phi(スライス用)とtheta(スタック用)がどれだけ進行するかを担当します。そして、プロセスはボトムキャップ、ボディ、トップキャップの作成に分かれています(以下を参照)。真ん中の半分(theta以下のように真ん中の50%)を達成するには、キャップを省略して、どういうわけかボディを変更する必要があります。スタック番号(1/4*stackNumbers to 3/4*stackNumbers)をいじっていましたが、思い通りの結果が得られませんでした。 真ん中の半分(pi/4 <theta <pi*3/4)を達成するには、球の生成をどのように変更すればよいですか?私の全体的な問題は、球を上部25%、中央50%、下部25%の3つの異なる部分に分割する方法ですか? プログラムで球を生成するための一般的なコードは次のとおりです。 private void generateSphere(int stackNumber, int sliceNumber, boolean facingOut) { int capVertexNumber = 3 * sliceNumber; int bodyVertexNumber = 4 * sliceNumber * (stackNumber - 2); int vertexNumber = (2 * capVertexNumber) + bodyVertexNumber; int triangleNumber = (2 * capVertexNumber) + (6 * sliceNumber …

3
メッシュが非表示になっているときに/後処理メッシュのアウトラインを非表示にする方法
3Dエンジンでアクティブなアウトラインを設定する作業をしています。選択した3Dキャラクターのハイライト効果や画面の風景です。ステンシルバッファーを操作し、満足のいく結果が得られなかった後(凹面形状の問題、カメラからの距離が原因のアウトラインの厚さ、デスクトップとラップトップ間の不整合)、エッジ検出とフレームバッファーサンプリングに切り替えて、アウトラインを取得しましたかなり満足しています。 ただし、選択したメッシュが別のメッシュの背後にある場合、アウトラインを非表示にできません。これは、残りのシーンをレンダリングした後、フレームバッファーから2Dシェーダーアウトラインをレンダリングするだけなので、私のプロセスを考えると理にかなっています。 結果の2つの画面キャプチャーを以下に示します。1つ目は「良好な」アウトラインで、2つ目は、アウトラインソースをブロックするメッシュ上にアウトラインが表示される場所です。 レンダリングプロセスは次のように実行されます。1)ハイライトされたメッシュのアルファのみを描画し、フレームバッファー(framebuffer1)に黒いシルエットをキャプチャします。 2)テクスチャをframebuffer1からエッジ検出を実行する2番目のシェーダーに渡します。フレームバッファ2でエッジをキャプチャします。 3)シーン全体をレンダリングします。 4)シーンの上部にあるframebuffer2からテクスチャをレンダリングします。 私は達成する方法についていくつかのアイデアを持っているので、それらの有効性、またはより単純な、またはより良い方法についてフィードバックを得たいと思っています。 最初に、シーン全体をフレームバッファーにレンダリングし、強調表示されたメッシュの可視シルエットをアルファチャネルに格納することを考えました(強調表示されたメッシュが表示されているところはすべて白で保存されています)。次に、アルファチャネルでエッジ検出を実行し、シーンフレームバッファーをレンダリングしてから、エッジを上にレンダリングします。次のような結果になります: これを実現するために、ハイライトされたオブジェクトのレンダーパス中にのみ、定義を設定して、可視ピクセルのアルファをすべて黒くすることを考えました。 私の2番目のアイデアは、上で概説した現在のレンダリングプロセスを使用することですが、選択したメッシュのシルエットをレンダリングするときに、framebuffer1のR、G、BチャネルにもX、Y、Z座標を格納します。エッジ検出が実行され、framebuffer2に格納されますが、RGB / XYZ値をアルファのエッジからシルエットに渡します。次に、シーンをレンダリングするときに、座標がframebuffer2に格納されているエッジ内にあるかどうかをテストします。その場合は、現在のフラグメントの深度をテストして、RGBチャネルから抽出された座標(カメラ空間に変換)の前か後ろかを判断します。フラグメントが深度座標の前にある場合、フラグメントは正常にレンダリングされます。フラグメントが背後にある場合は、塗りつぶされたアウトラインカラーとしてレンダリングされます。 私はこのプロジェクトにLibGDXを使用しており、WebGLとOpenGL ESをサポートしたいので、ジオメトリシェーダーや新しいGLSL関数を使用するソリューションはありません。私の提案したアプローチについて誰かがコメントしたり、より良い提案をしたりできるとしたら、本当にありがたいです。

1
ゲームループとopenGLの間のマルチスレッドを利用する
openGLレンダラーに基づくゲームのコンテキストで話す: 2つのスレッドがあるとしましょう: ゲーム内オブジェクトのゲームロジックや物理などを更新します ゲームオブジェクトのデータ(スレッド1が更新し続ける)に基づいて、各ゲームオブジェクトのopenGL描画呼び出しを行います。 ゲームの現在の状態で各ゲームオブジェクトの2つのコピーがない限り、スレッド2が描画呼び出しを行っている間、スレッド1を一時停止する必要があります。そうでない場合、ゲームオブジェクトはそのオブジェクトの描画呼び出しの途中で更新されます。望ましくない! ただし、スレッド1を停止してスレッド2から安全に描画呼び出しを行うと、マルチスレッド/同時実行の目的全体が失われます。 マルチコアアーキテクチャを活用してパフォーマンスを向上させるために、数百または数千または同期オブジェクト/フェンスを使用する以外に、これに対するより良いアプローチはありますか? マルチスレッドを使用して、現在のゲームの状態にまだ含まれていないオブジェクトのテクスチャをロードしてシェーダーをコンパイルできることはわかっていますが、アクティブ/可視オブジェクトに対して、描画と更新の競合を引き起こさずにそれを行うにはどうすればよいですか? ゲームオブジェクトごとに個別の同期ロックを使用するとどうなりますか?このように、すべてのスレッドは、更新/描画サイクル全体ではなく、1つのオブジェクト(理想的なケース)でのみブロックします!しかし、各オブジェクトのロックを取得するのにどのくらいのコストがかかりますか(ゲームには1000のオブジェクトがある場合があります)?

1
同じビットサイズのレンダーターゲットが重要なのはなぜですか?
現在、遅延シェーディングに必要なGBufferのタイプを考えているので、最も一般的なものとそのフォーマットについてオンラインでドキュメント化しようとしました。 私が見たほとんどのGBufferは、各レンダーターゲットに同じビットサイズを使用しており、多くの場合、未使用のチャネルにもつながります。しかし、私のGBufferの最初の推測として、紙の上では、2つの24ビットターゲットと2つの32ターゲット、または3つの24と1 32が必要です。 各添付ファイルを同じ「サイズ」にするとより適切に位置合わせできることを理解していますが、実際には、チャネルを無駄にして(または将来の使用のために予約して)すべてのRTを同じサイズにするか、必要なものだけを使用する方が良いですか?前者の場合、なぜそのような利点があるのか​​、とにかく24ビットのものは32にパディングされるのでしょうか?

1
OpenGLでは、「ゼロ状態」レンダリングとは何ですか?
最近の就職の面接で、私は自分の近代的なOpenGLと頂点バッファーオブジェクトを使用したレンダリングについて学びました。なぜなら、私の大学では、即時モードレンダリングを使用する固定関数パイプラインしか教えていないためです。インタビュアーは、VBOが「ゼロステートレンダリング」と呼ばれるものに効果的に置き換えられたと私に簡単に割り込んだので、続けます。 すぐに別のテーマに移り、面接官は忙しいスケジュールのために最後に時間切れになったので、私は後でそれが何を意味するかについて尋ねるのを忘れていました。 その後、オンラインで「OpenGLゼロ状態」と「ゼロ状態レンダリング」を検索しましたが、関連すると思われる結果は得られませんでした。ほとんどがOpenGL状態に関するものだけです。 問題の組織は非常に研究に基づいているため、現在ほとんどサポートされていない拡張機能である可能性がありますか、それとも最先端の性質のために使用される用語が異なる可能性がありますか?

2
複数のオブジェクトをレンダリングするには、いくつのOpenGLプログラムを使用する必要がありますか?
私のシーンには複数のオブジェクトが含まれています。(3つの立方体、1つの円柱、8つの球体としましょう。)それぞれに頂点シェーダーを作成する必要があると仮定します。いくつのプログラムが必要ですか? 代替案: オブジェクトごとに1つのプログラム すべてのキューブ用のプログラムと、すべての球用のプログラム(同じシェーダーを使用する場合) すべてのための1つの大きなプログラム 正しいアプローチは何ですか?

1
大きな地形メッシュを効率的にレンダリングする方法は?
最近、ゲームに地形を生成する最良の方法について考えている問題に悩まされています。別のプロジェクトでは、通常はハイトマップを使用したため、すべてのコアワークは使用されたエンジンに基づいていましたが、地形には正確に描画する必要がある数百万の特定のポリゴンがあるため、これは実行できません。また、それらの多くはYベクトルから解析できません(ポリゴンが下に隠れているため)。つまり、ハイトマップはここでは役に立ちません。この場合、COLLADAオブジェクトを使用する必要がありました。 誰かがBlenderのようなソフトウェア内でモデルを手動で分割するように言ったが、残念なことに、これらの地形は別のソフトウェアのチャンクで作成され、ゲームに読み込まれるため、これも不可能である(それはアイデアだ)。したがって、これは毎回手動でスライスすることを余儀なくされる大きな仕事になるでしょう。 したがって、この問題を1週間解決して、このメッシュ、つまり地形をカメラのフラストラムに応じて手続き的にロードする方法について1週間研究してきました。これにより、可能な限りパフォーマンスを節約できます。手続き型メッシュの生成に関する多くのドキュメントに出くわしましたが、メッシュを八分木にマッピングすることで問題を解決できると思います。これは少なくとも私にとっては大きな仕事であり、それが私がここにいる理由です。なぜなら、私は経験豊富な人々から聞く前に間違った道をたどるリスクを冒したくないからです。 要するに、私には何百万もの頂点とインデックスがあり、それらが一緒になって地形を形成していますが、明らかな理由により、それらを同時に描画することはできません。何らかの手続きが必要です。大きなメッシュを地形として扱うために、それを行うための最良の方法は何ですか?それに関する具体的な本はありますか?それを実装する最良の方法はありますか? どんな間違いでもすみません、私はこの分野の初心者です。

2
OpenGLは複数の重なり合うオブジェクトのアウトラインを取得します
私はc ++でopenglを使用して作成した進行中のゲームのアイデアを持っています。プレイヤーが何かに勝ったときに、複数の重複するオブジェクトに大きなアウトライン(5〜6ピクセル)が欲しいです。 最良の方法はステンシルバッファーを使用することだと思いましたが、ステンシルバッファーを画面外にレンダリングしようとするのは数時間であり、どんな種類の結果も達成できないので、大したことはありません。他にもいくつかテクニックがあります! これは私が入手したいものです: 何か案は?
10 opengl  outline 

1
エンジンレンダリングパイプライン:シェーダーを汎用にする
OpenGL ES 2.0(現在のところiOS)を使用して2Dゲームエンジンを作成しようとしています。私は、Objective Cでアプリケーション層を記述し、C ++で別の自己完結型のRendererGLES20を記述しました。レンダラーの外部ではGL固有の呼び出しは行われません。完全に機能しています。 しかし、シェーダーを使用する際にいくつかの設計上の問題があります。各シェーダーには、メインの描画呼び出しの直前に設定する必要のある独自の固有の属性とユニフォームがあります(この場合はglDrawArrays)。たとえば、いくつかのジオメトリを描画するには、次のようにします。 void RendererGLES20::render(Model * model) { // Set a bunch of uniforms glUniformMatrix4fv(.......); // Enable specific attributes, can be many glEnableVertexAttribArray(......); // Set a bunch of vertex attribute pointers: glVertexAttribPointer(positionSlot, 2, GL_FLOAT, GL_FALSE, stride, m->pCoords); // Now actually Draw the geometry glDrawArrays(GL_TRIANGLES, 0, m->vertexCount); // …

2
gl_quadsを使用する利点はまだありますか?
わかりました。gl_quadsは非推奨であることを理解しているため、もはや使用することは想定されていません。また、最近のPCでgl_quadsを使用してゲームを実行すると、実際には2つの三角形が描画されることも理解しています。 今、私はゲームが代わりに三角形を使って書かれるべきだと聞いたことがあります。しかし、OpenGLがそのクワッドを2つの三角形にどのように作成するかの詳細のために、クワッドをまだ使用することがこれまでに有利であるかどうか疑問に思っています。 具体的には、現在、かなり大きなバッファーオブジェクトから、接続されていない多くのクワッドをレンダリングしています。注意が必要な領域の1つは、これらのバッファーオブジェクトを作成/更新するために使用しているフロートのベクトルがどれだけ大きいかです(頂点ごとにかなりの数の追加のフロート値と、バッファー内に多数の頂点があります-最大のバッファーは約500KBです)。 したがって、バッファオブジェクトを変更して三角形を描画する場合、この頂点データは50%大きくなり(6つの頂点では4ではなく正方形を描く)、CPUが生成するのに50%長くかかることがわかります。 gl_quadsが引き続き機能する場合、ここでメリットがありますか、それともOpenGLの2つの三角形への自動変換で50%の追加メモリとCPU時間を使用していますか?
10 opengl 


2
手足を切り取ってレンダリングするキャラクター(Java / OpenGLのブレンダーモデル)
取り外し可能な四肢を持つことができるようにしたい場合、キャラクターアニメーションとレンダリングクラスを作成する際にどのような点を考慮する必要がありますか?私は神経系に至るまですべてを定義できる詳細な身体システムを開発しました。ドワーフフォートレスに見られるダメージの詳細レベルに似たものを目指しています。たとえば、キャラクターが上腕を損傷すると、腕全体を無効にする神経損傷の可能性があります。または、腕を完全に失う可能性があります。 このデータ部分を処理するためにシステムを作成しました。各キャラクターには、付属物と内部パーツを持つトランクがあります。各付属肢は、子付属肢と内部パーツを持つこともできます。親の付属肢が無効化/削除されている場合、子の付属肢は無効化/削除されます。無効化/削除された付属物または内部部品のいずれかが一生必要な場合、キャラクターはすぐに死亡します。 私が現在取り組んでいるのは、この描画/アニメーション部分です。アニメーションを定義して、現在の身体の状態(腕や脚がないなど)を考慮して、許可されているアニメーションを知るにはどうすればよいですか?足りない手足を描画しないように描画システムを設定するにはどうすればよいですか?各四肢/付属物は独自のモデルである必要がありますか(切断された付属物を地面に描きたい)。 移行元のシンプルなシステム(テスト用に作成したもの)は、アニメーションのすべてのキーフレームを完全なモデルとしてVBOにインポートします(キーフレームが開始/停止する場所の頂点カウントとともに)。Blenderで定義されたボーンをインポートしたり利用したりせず、フレーム間を補間しません。 これはかなり大きな質問である可能性が高いため、目的の場所にたどり着くためのリソースも探しています。 編集 必要な手足がない場合に代替アニメーションを実行するように設定したいので、アニメーションしている手足を知っているアニメーションについて質問します。それを考えた上で、アニメーションを起動する前にそのチェックを行い、その時に適切なアニメーションを起動することを想像します。

1
変形面
私はレベルサーフェスの変形する物理的な動作を達成しようとしていますが、これまでの実装から始める方法がわかりません。 表面の形状(平面、立方体、球…)に関係なく、ゲームエンティティ(プレーヤー、敵、オブジェクト…)の位置に小さなインデントを設定したいと思います。 説明するのはちょっと複雑なので、私が話していることを説明しました。球の例を次に示します。 したがって、表面は少し変形する必要があります(本当に柔らかいベッドやソファーのように見えるようにするため)。私のサーフェスでは、スムーズな変形を実現するためにおそらく高い頂点数が必要ですが、私の大きな問題は、この変形を計算するための数学です。 私はOpenGLを使用してC / C ++でプログラミングしていますが、正しい方向のアドバイスは問題ありません。

1
OpenGLで「夜空」効果を作成するにはどうすればよいですか?
OpenGLを使用してゲームを作成していて、星が数個ある夜空の効果をレンダリングしたいと考えています。 空にピカピカの黒の効果を入れて見栄えを良くしたいです。誰かがそれを進める方法を手伝ったり、良いチュートリアルへのリンクを提供したりできますか?
10 opengl  sky 

2
どのOpenGLテクスチャフォーマットがネイティブでサポートされているかをどのように検出しますか?
たとえば、ビデオカードが「bgr8」をサポートしていないかどうかを検出し、ソフトウェアモードで「rgba8」などの別の形式に変換する方法。 更新:混乱してすみません。状況の詳細この質問私は設定internalFormatでglTexImage2Dを「bgra8」のようなものではなくvideodriver内部で「RGBA8」のように、別の形式にデータを変換します。

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