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

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

3
OpenGL頂点属性-正規化
悲しいかな、私は検索しましたが、決定的な答えは見つかりませんでした。 次のコマンドを使用して、OpenGLの頂点データをいつ正規化しますか。 glVertexAttribPointer(index, size, type, normalize, stride, pointer); つまり、いつですかnormalize == GL_TRUE。どのような状況で、なぜGPUに前処理の代わりに計算をさせることにしたのですか?私が今まで見たすべての例では、これをGL_FALSEに設定しています。個人的にはその使用法を見ることができません。しかし、クロノスは愚かではないので、何か有用な(そしておそらく一般的な)もののために存在しているはずです。
8 opengl  c  vertex 

6
厳密に2Dゲームには法線が必要ですか?
純粋な2Dゲームを作成することでOpenGLを学び始めています。 頂点のフォーマットを決定する必要があります。通常のコンポーネントが必要ですか?それとも、2Dコンポーネントでは不要ですか? 私の直感は、すべてが平らなので必要ないだろうと言っています。しかし、おそらく私はいくつかのシェーダーや私がまだ見ないもののためにそれを必要としています。
8 opengl  2d  normals 

6
3Dレンダリングコンポーネントの抽象化のレベルは正しいですか?
私はこの領域の周りにたくさんの質問を見てきましたが、この正確な質問ではないので、これが重複している場合はお詫びします。 小さな3Dゲームを作っています。正直なところ、それはほんの少しの趣味のプロジェクトであり、実際のゲームにはならない可能性があります。素敵なグラフィックデモを作成し、3DレンダリングとC ++デザインについて学びたいと思います。 私の意図は、レンダリングにdirect3d9を使用することです。これについては少し経験があり、私の要件を満たしているようです。ただし、プログラマーとして1つのことを学んだ場合は、「このコンポーネントが別の実装に置き換えられる可能性があると考えられる理由はありますか」と答えます。答えが「はい」の場合、適切な抽象化とそのコンポーネントへのインターフェイスを設計する必要があります。 。そのため、d3d9を実装するつもりでも、d3d11、openglに実装できる3dインターフェイスを設計する必要があります... 私の質問は、これを行うのに最適なレベルは何ですか?作成して後で描画できるインターフェースだと思います 頂点バッファーとインデックスバッファー テクスチャー 頂点とピクセルの「シェーダー」 描画状態のいくつかの表現(ブレンドモードなど...) 言い換えれば、たとえばアニメーションモデルを描画するためのコードが、抽象頂点バッファーなどを取得するためにインターフェイスを使用するかなり低レベルのインターフェイスです。低すぎるので、必要なすべての機能を抽象化できないのではないかと心配しています。 別の方法は、インターフェイスがオブジェクト、アニメーション、風景などを描画し、各システムに実装できる、より高いレベルでこれを行うことです。これはもっと手間がかかっているように見えますが、私はもっと柔軟だと思います。 だから、それが私の質問です。描画システムを抽象化するとき、どのレベルのインターフェイスが最適ですか。
8 c++  opengl  directx 

5
OpenGLのマトリックススタックと手動乗算
OpenGLの変換スタックを使用するか、手動で変換を適用する方が効率的です。 グラフィックパイプラインの状態遷移の数を最小限に抑える必要があるとよく耳にします。翻訳マトリックスのプッシュとポップは大きな変化のようです。ただし、グラフィックスカードは、並列実行ハードウェアを使用して頂点を一括乗算することで、パイプラインの問題を補う以上のことができるのではないかと思います。 私の特定のケース。スプライトシートにフォントをレンダリングしました。各文字または文字列の座標が計算され、頂点バッファーに追加されます。次に、そのストリングを移動する必要があります。頂点バッファーを反復処理して、各頂点を手動で調整するか、一時的に新しい変換行列をプッシュする方が良いでしょうか?


4
3Dシェーディング/ライティングのサポートが必要
3Dゲームでシェーディングをどのように処理しますか?私は立方体で作られた木の片側を遮光する指向性光源を持っています。残りの3辺はすべてアンビエントシェーディングのみを取得します。したがって、アンビエントシェーディングされた2つの側面を見ると、3D効果は失われます。何か不足していますか?光源から最も遠い側をさらに暗くする必要がありますか?私はフォールアウト3を見てみましたが、これは彼らが何をしているように見えますが、Minecraftは2つの反対側のライトと残りの2つの反対側のダークでグラスマウンドをシェーディングし、2つのライトに2つの指向性ライトがあるという効果を与えます。シェーディングされたサイドと暗いシェーディングされたサイドのアンビエントライト。

1
glCreateShaderがセグメンテーション違反を引き起こす
sfmlでシェーダーを使用しようとすると、シェーダーを作成できません。関数glCreateShader(GL_VERTEX_SHADER); セグメンテーション違反が発生します。最初にグーグルで調べたところ、プログラムがopenglコンテキストを持っていない場合にそうなることがわかりました。私は最初にSDLを試しましたが、不十分なドキュメントと「ヘッダーを見て何をすべきかを知る」ことでsfmlに行きました セグメント障害の原因となるコードは次のとおりです sf::Window App(sf::VideoMode(800, 600, 32), "SFML OpenGL"); // Set color and depth clear value glClearDepth(1.f); glClearColor(0.f, 0.f, 0.f, 0.f); // Enable Z-buffer read and write glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); // Setup a perspective projection glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLuint vertShader = glCreateShader(GL_VERTEX_SHADER); //... gcc linuxでopengl 2.1を使用して、glew、gl.h、sfml-window、sfml-systemを含めています。 何が欠けている?
8 opengl  sfml 

4
2Dプラットフォーマーの衝突処理
2Dプラットフォーマー(マリオタイプ)ゲームを作成しようとしていますが、衝突の適切な処理に問題があります。私はこのゲームをC ++で書いており、入力、画像の読み込み、フォントの読み込みなどにSDLを使用しています。また、グラフィックを表示するためにSDLと組み合わせてFreeGLUTライブラリを介してOpenGLを使用しています。 私の衝突検出方法は、AABB(Axis-Aligned Bounding Box)です。必要なのは、衝突が発生した側を検出し、衝突を適切に処理する簡単な方法です。したがって、基本的に、プレーヤーがプラットフォームの上部に衝突した場合は、プレーヤーを上部に移動します。側面に衝突がある場合は、プレーヤーをオブジェクトの側面に戻します。底に衝突がある場合は、プラットフォームの下にプレーヤーを再配置してください。 私が試してみました多く、このような浸透深さを見つけようと侵入深さによって後方プレーヤーを再配置するようにこれを行うためのさまざまな方法を、。残念ながら、私が試したことは何も正しく動作していないようです。プレイヤーの動きが非常にグリッチになり、望まないときにプレイヤーの位置を変えます。その理由の1つは、おそらくこれはとても単純なものだと思っているためですが、考えすぎています。 誰かが彼らが助けることができると思っている場合は、以下のコードを見て、可能であればこれを改善するのを助けてください。これを処理するためにライブラリを使用しないでください(自分で学びたいので)、または可能であればSAT(分離軸定理)のようなものを使用しません。よろしくお願いします! void world1Level1CollisionDetection() { for(int i; i < blocks; i++) { if (de2dCheckCollision(ball,block[i],0.0f,0.0f)==true) { de2dObj ballPrev; ballPrev.coords[0] = ball.coords[0]; ballPrev.coords[1] = ball.coords[1]; ballPrev.coords[2] = ball.coords[2]; ballPrev.coords[3] = ball.coords[3]; ballPrev.coords[0] -= ball.xspeed; ballPrev.coords[1] -= ball.yspeed; ballPrev.coords[2] -= ball.xspeed; ballPrev.coords[3] -= ball.yspeed; int up = 0; …

5
シェーダーを使用せずにOpenGLで2Dゲームのオブジェクトをぼかす方法はありますか?
OpenGLでシェーダーを使用せずにオブジェクトをぼかす良い方法はありますか? 現在、ぼかしは、オブジェクトを元の位置からわずかに上、下、左、右、および4つの対角線としてレンダリングすることで実現しています。これを行うにはもっと良い方法があるはずです。2Dシーンで作業しています。
8 2d  graphics  opengl 

3
glTranslate、正確にはどのように機能しますか?
glTranslateがどのように機能するのか理解できません。最初は、単に軸に値を追加して変換を行うだけだと思っていました。 ただし、ビットマップをロードする2つのオブジェクトを作成しました。1つはGL_TEXTUREに設定された行列を持っています。 public class Background { float[] vertices = new float[] { 0f, -1f, 0.0f, 4f, -1f, 0.0f, 0f, 1f, 0.0f, 4f, 1f, 0.0f }; .... private float backgroundScrolled = 0; public void scrollBackground(GL10 gl) { gl.glLoadIdentity(); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glTranslatef(0f, 0f, 0f); gl.glPushMatrix(); gl.glLoadIdentity(); gl.glMatrixMode(GL10.GL_TEXTURE); gl.glTranslatef(backgroundScrolled, 0.0f, 0.0f); gl.glPushMatrix(); this.draw(gl); gl.glPopMatrix(); …

1
GLSLデフォルトシェーダー
エラーチェックコードでエンジンを準備しています。私はこの状況を最善の能力で説明するつもりです。シェーダーをロードしてエラーが発生したときはいつでも(ファイルが存在しない、コンパイルエラー、問題が発生する可能性があるすべて)シェーダーを削除し、ポインターを0に設定します(これを確認する別の方法は考えられません)誤ってゴミを添付または削除しようとした場合)。これが発生した場合、プログラムを停止したくありません。誰かが誤ってゲームフォルダー内の1つのファイルを削除または変更し、そのためにゲーム全体を使用不可にしたくないからです。 さて、ポインタが0であるプログラムにシェーダをアタッチする場合、デフォルトの動作はありますか? 私のプログラムでは、頂点シェーダーが0に、フラグメントシェーダーが0に接続されている場合、OpenGLはデフォルトのプログラムを使用します(すべてが白で表示されます)。 これは、ディメンションが既にクリップスペースにある回転した立方体であり、透視投影や深度チェックなしでレンダリングされます。.objファイルから読み込まれます。 ここで、適切なフラグメントシェーダーをアタッチしたが、頂点シェーダーが0になると、次のようになります。 これは私が期待することです。フラグメントシェーダーはすべてvec4(1.0、0.3、0.7、1.0)を出力します。頂点シェーダーがないため、OpenGLはデフォルトのシェーダーを使用します(これは正しい仮定ですか?)。 ただし、正しい頂点シェーダーをアタッチしたが、フラグメントシェーダーを0にアタッチした場合(または、フラグメントシェーダーをまったくアタッチしない場合)、次のようになります。 目に見えないのは、このモデルが絶えずさまざまな色でペイントされていることです。そのため、私の画面では、黒い水平線が通る酸性の旅行のように見えます。 私は少し混乱しています。なぜなら、私は立方体がちょうど白いことを期待しているからです。私のシェーダーコードは最低限の骨であり、頂点シェーダーとフラグメントシェーダーの間で変数を交換していないことを指摘しておきます。ポインターが0に等しくないかどうかを確認しても何も変更されません。リンクされたプログラムは、ポインターに0を指定した場合と同じように動作します。私にとって最も奇妙なのは、常にゴミ箱ではなく、適切に網掛けされていることです。 編集:おそらくデフォルトのフラグメントシェーダーは、設定を省略している頂点からのgl_値を期待していますか?これは、表面が適切にシェーディングされる理由を説明するものであり、フラグメントシェーダーはスムーズなインを期待していますが、その値は単なるゴミです。 これは「未定義の振る舞い」ですか、それともどのように機能すると思われますか?

1
骨のアニメーション-行列と計算
プロジェクトの完了に関しては、最終段階にありますが、アニメーションシステムを実装する直前です。 クライアントは「ボーンアニメーション」を選択することにしました。つまり、このアニメーション化されたオブジェクトが持つすべてのフレームとすべてのボーンに対して、各変換マトリックス(matrix4x4 rotation + translation)をエクスポートする必要があります。 ゲーム内のオブジェクトは3DS Max Physiqueモディファイヤでアニメーション化されているため、頂点ごとにボーン/ウェイトデータがあります。しかし、この件について少し理解するために、ここでは説明を簡略化します。 この投稿を2つのポイントに分割します。 すべてのフレームのボーンマトリックスのエクスポート 後のアニメーションの目的でボーンの位置をエクスポートする正しい方法について扱います。この場合、このボーンの影響を受けるすべての頂点をフレームXのボーンの位置に「移動」および「回転」する必要があります。 最終的な頂点位置の計算 フレームXのボーン変換に従って新しい頂点位置を計算するために、適切な行列演算について扱います。 1.フレームごとにボーンマトリックスをエクスポートする アニメーション化されたオブジェクトをエクスポートするときに、次のことを行う必要があることを正しく理解していますか? フレーム0でBONE変換行列を取得し、この行列を反転します FRAMExでBONE変換行列を取得 1 * 2を乗算して、FRAMExでのBONEの変換オフセットを取得します [pseudocode] // Animation export // For each frame, export bone transformation offset for(int iFrame = 0; iFrame < vFrames.size(); iFrame++) { // For every bone in the object for(int iBone …

1
流体シミュレータの移流プログラムの奇妙な問題
2D流体シミュレータを実装しました。ソルバーは完全にGPUで実行されます。すべて正常に動作します...私の仕事用PCで。しかし、自宅のPCではひどい不具合があり、それらを修正する方法を理解できません。経験的に、問題がadvectプログラムのどこかにローカライズされていることを発見しました。これは、私がビデオを統合した仕事で、そして自宅で— NVIDIA GeForce 9800 GTは非常に奇妙な原因です。次に、advectプログラムのGLSLソースを示します(明確にするために一部の行が省略されています)。 #version 130 out vec3 value; uniform sampler2D q; uniform sampler2D velocity; uniform float dt; uniform float inverseSize; void main() { vec2 p = gl_FragCoord.xy * inverseSize; vec2 np = p - dt * texture(velocity, p).xy; value = texture(q, np).xyz; } そしていくつかのスクリーンショット。 仕事用PC: 自宅のPC:
7 opengl  physics  glsl 


1
OpenGLでリストを表示する
シーンが描画されるたびに、GL_TRIANGLESを再作成するよりも、頂点を表示する方が速い方法があると聞きました。この方法は時代遅れだとどこかで読んだと思いました。OpenGLグループがより高速なものを削除するのはなぜですか?それが時代遅れであっても、これを実装するにはどうすればよいですか?

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