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

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

1
トーンマッピングと目の順応-淡い色と暗い画像
私は目の順応とHDRとともにトーンマッピングを実装しようとしています。実際に実装しましたが、結果に満足できず、何か間違ったことをしたと思います。 私の最終的な画像(後処理前)は、フロートテクスチャの半分に保存しています。2つのヘルパーテクスチャもあります。最初のログは、最後のミップマップにログの輝度とその平均、最小、最大の色を保存します。2つ目は、次のように計算される適応値を格納します。 prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate)) ここで、prevLumは以前の適応値です(このテクスチャのサイズは1x1です)。対数輝度テクスチャはR8B8G8形式で、2番目はR8です。チュートリアルでは、フロートテクスチャの半分が使用されていることを確認しましたが、私の場合、画像が明るすぎます(ほぼ白)。 最後のポストプロセスシェーダーでは、このコードを使用してアイアダプテーションとトーンマッピングを取得するためにすべての値を使用しています。 float autokey(in float lum) { return 1.03 - 2.0 / (2.0 + log10(lum + 1.0)); } float hejl(in float color) { float x = max(0.0, color - 0.004); return (x * (A * x + B)) / …

2
GLFWのキーボード入力を別のオブジェクトに転送するにはどうすればよいですか?
GLFW3を使用して別のクラスでキーボードイベントを実行しようとすると問題が発生します。私が抱えている問題は、GLFW3が次のように入力に静的関数を使用することです。 static UI u; ... ... static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { u.controls(window, key, action); } uまた、静的であり、コントロールはWSADキーの入力を保持します(キーイベントを取得できる唯一の方法)。ここから、キーを押すと、コンソールウィンドウでどのキーが押されたかが表示されます。私が抱えている問題は、押されたキーを使用して別のクラスの変数を操作しようとすることです。 この関数を持つMainMenuという別のクラスupdate().があります。この関数内でUIクラスを使用する方法はありますか?
9 opengl  c++  keyboard  glfw 

1
3Dカメラの回転
許してください、しかし私は助けを必要としています、そして私は今数週間これに行き詰まっています、私は進歩を遂げておらず、どこへ行っても私は別の答えを見ます、私が試みるすべてがうまくいきません。私は十分なヒントとアドバイスを持っています。今、私はこれを理解することができないので、誰かが私に後戻りするための答えをくれる人を本当に必要としています。 この主題を最も混乱させたのは、誰もが異なる規則または規則のセットを使用する方法であり、それらの答えは、何であるかを定義せずに独自の規則に基づいています。 だからここに私が最も一般的で論理的であると思われるものに基づいて形成した一連の規則があります: 軸の右手の法則。 正のYは上向き、正のZは視聴者向き、正のXは右向きです。 シェーダーに送信されるときに転置される行メジャー行列。 ピッチ:X軸を中心とした回転 ヨー:Y軸を中心とした回転 ロール:z軸を中心とした回転 ローテーション順:ロール、ピッチ、ヨー(これは正しいですか?誰かがこれを確認できますか?) 正の回転値は、軸の正の端から見下ろすと、時計回りに回転します。 すべての軸にわたる0回転のデフォルトの方向は、負のYを指すベクトルです。 ..それらの慣例を考えると(間違っている場合は必ず私を訂正してください!) LookAt関数を記述しますか?(lookAt(ベクター位置、ベクターアイフォーカス、ベクターアップ)) 回転行列を計算します。(回転(x、y、z)) 私はこれらの2つの質問に少なくとも過去3週間以上答えてみました。LookAt&Rotation Matrix関数を少なくとも30回書き直しました。何百ものウェブサイトと多くの解答された質問を読み、他の人々のコードをコピーしました、そして私がこれまでに作った何もうまくいきませんでした、すべてが間違った結果を生み出しました。それらのいくつかは、正しい回転にさえ近くないいくつかの陽気に奇妙な出力を生成しました。 私は昨夜を除いて毎晩これに取り組んできました。繰り返し失敗することにとてもイライラしていて、私は立ち止まって休憩しなければならなかったからです。 正しい方法を教えてください。それから逆に作業して、それがどのように機能するかを理解できます。正しい答えが得られず、これが私を少し狂わせています! 私はJavaで書いていますが、任意の言語で書かれたコードを使用します。私の3Dレンダリングコードのほとんどは実際には非常に見事に機能しています。それは理解できない数学にすぎません。 更新:解決済み ご協力ありがとうございました!私は実際に私が実際に理解しているルックアット関数を手に入れました、そして私は幸せにすることができませんでした(誰かがぜひともそれを見たいと思っているなら)。 ピッチ/ヨー/ロール変数に基づいて回転行列を作成することを再試行しましたが、再び失敗したようですが、フリールックカメラのオイラー角を使用しようとしてダンプすることにしました。代わりに、クォータニオンクラスを作成し、そのパスを下る方が幸運かもしれません。それ以外の場合は、球座標としてピッチ/ヨーを使用し、回転には新しい機能のLookAt関数を使用します。 他の誰かが同様の問題に直面していて質問をしたい場合は、遠慮なくお問い合わせください。 助けてくれてありがとう!

3
複数の行列を頂点シェーダーに送信するにはどうすればよいですか?
ボーン/スキニングを使ったアニメーションを練習しています。頂点ごとに1つのマトリックスをシェーダーに送信しようとしています。私はこれら2つのアプローチを考えることができます。 方法1 このように各骨マトリックスに1つの均一なハンドルがあります u_Bone0 = GLES20.glGetUniformLocation(mProgram, "u_Bone[0]"); u_Bone1 = GLES20.glGetUniformLocation(mProgram, "u_Bone[1]"); そして、onDraw私はそれらのそれぞれをシェーダーに送ります: GLES20.glUniformMatrix4fv(u_Bone0, 1, false, matrix0, 0); マトリックスが多数ある場合、これは明らかに良い方法ではありません。リファクタリングするコードがたくさんあるのでまだ試していない私の2番目のアイデア 方法2 を使用しglUniformMatrix4fvてそれらを一度にすべて送信することです(20個の行列があると仮定します) GLES20.glUniformMatrix4fv(u_Bones, 20, false, matrices, 0); はどこmatricesですかfloat[16 * 20]。ただし、各ボーンのマトリックスを変更するのは少し面倒になります。たとえば、3番目の行列を取得する場合、次の行に沿って何かが必要です。 float[] _3rd = Arrays.copy(matrices, 3*16, 4*16); 値を保存すると、さらに煩わしくなります。 私は現在方法1を使用していますが、あまりスマートに見えません... 複数のマトリックスをOpenGL ES 2シェーダーに送信する最良の方法は何ですか? LE:私はAndroidを使用しているので、Javaソリューションを探しています。


3
OpenGLが実際に画面を更新するのにどのくらい時間がかかりますか?
キー入力に応じてさまざまなものを描画する単純なOpenGLテストアプリをCで作成しています。(Mesa 8.0.4、Mesa-EGLおよびGLFW、NVIDIA GTX650を搭載したPC上のUbuntu 12.04LTSで試した)。ドローは非常にシンプル/高速です(回転三角形タイプのもの)。私のテストコードは、フレームレートを意図的に制限するものではなく、次のようになっています。 while (true) { draw(); swap_buffers(); } 私はこれを非常に注意深く計時しており、1つのeglSwapBuffers()(またはglfwSwapBuffers、同じもの)呼び出しから次の呼び出しまでの時間は〜16.6ミリ秒であることがわかりました。eglSwapBuffers()描画されたものは非常に単純ですが、呼び出し後から次の呼び出しの直前までの時間は、それより少しだけ短くなります。スワップバッファの呼び出しにかかる時間は1ミリ秒未満です。 ただし、アプリがキーの押下に応じて描画内容を変更してから実際に画面に表示されるまでの時間は、> 150ms(約8〜9フレーム)です。これは、画面とキーボードを60 fpsでカメラで記録して測定されます。 したがって、質問: スワップバッファーの呼び出しと実際に画面に表示される呼び出しの間の描画はどこにバッファーされますか?なぜ遅れるの?アプリが常に画面の前に多くのフレームを描画しているようです。 OpenGLアプリケーションは、画面にすぐに描画するために何ができますか?(つまり、バッファリングなし、描画が完了するまでブロックするだけです。高スループットは必要ありません。低遅延が必要です) 上記の即時抽選をできるだけ早く行うためにアプリケーションは何ができますか? アプリケーションは現在、実際に画面上にあるものをどのようにして知ることができますか?(または、現在のバッファリング遅延はどのくらいの長さ/何フレームですか?)

1
2Dゲームに最新のOpenGLを使用する方法
3D用の「モダンな」OpenGL(3.0+)チュートリアルをたくさん見つけましたが、2Dゲーム開発にそれを使用する方法に関する情報を探したところ、ほとんど何も見つかりませんでした。2D gamedevにOpenGLを使い始めるにはどうすればよいですか? 具体的には、以下のトピックに対する回答を得ることに興味があります。 さまざまなマトリックスを正投影に設定するにはどうすればよいですか? シェーダーは2Dアプリケーションで3Dアプリケーションと同じくらい頻繁に使用されますか?もしそうなら、2D設定での目的は何ですか? 2Dゲームに明らかに必要な膨大な数のテクスチャをどのように処理すればよいですか? 比較的幅広い質問をお詫び申し上げますが、検索に長い時間を費やしており、最新のOpenGLに適用される有用な情報はほとんど見つかりませんでした。
9 opengl  2d 

1
ミップマップを使用したテクスチャ座標の不連続性により継ぎ目が作成される
私はopenGLの学習を始めたばかりで、ミップマップで球体をテクスチャリングするときにこのアーティファクトを取得しています。基本的に、フラグメントがテクスチャのエッジをサンプリングするときに、不連続性(たとえば1から0まで)を検出し、最小のミップマップを選択して、この醜いシームを作成します。 醜い縫い目http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png だから私はtextureGradを使用してグラデーションを手動でオーバーライドしようとしました: //fragVert is the original vertex from the vertex shader vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5)); vec2 ll2 = ll; if (ll.x < 0.01 || ll.x > 0.99) ll2.x = .5; vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2)); …

1
2D水上面プロファイル
頂点フラグメントシェーダーを使用して、水面の厚さの効果を作成しようとしています。 私は3Dゲーム環境にいますが、それはスクロールビューなので、「2D」ビューです。 以下は、フラグメントシェーダーを使用して実際の2Dでこのような効果を作成するための優れたチュートリアルです。 しかし、これは私の場合には使用できないと思います。今のところ、屈折を適用するのは平面だけです。 そして、水厚効果を適用したいです。しかし、私はそれを行う方法がわかりません。 現時点では、頂点を使用して水の変形/変位を作成しようとはしていません。これはポイントではありません。 シンプルなクワッドで可能かどうかはわかりませんが、このようなオブジェクトを使用する必要があるかもしれません。 下記は用例です。 この効果をどのように作成するかについては、私にはまったくわかりません。 どうもありがとう ! [ 編集 ]レイマンウォーターエフェクトが追加され、エフェクトの参照が改善されました。

1
GPUとCPUでのメッシュ操作
ちょっと気になります-CPUまたはシェーダーのどこでメッシュ操作を実行しますか?私はCPUですべてを行っており、友人がGPU側に物事を移動することを提案しました。 GPUでボーンアニメーションなどを実行している場合、どうやってメッシュを元に戻すのですか?(私は衝突検出をしているので...)
9 opengl  3d 

1
gluLookAtはどのように機能しますか?
私の理解から、 gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 以下と同等です。 glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); しかし、ModelViewマトリックスを出力すると、への呼び出しがglTranslatef()正しく機能していないようです。コードスニペットは次のとおりです。 #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

2
実際のシナリオでクワッドベースのレンダリングについて心配する必要がありますか?
ランダム化された本の最初の章では、ほとんどの場合、ラスター化とレンダリングの手法について、三角形ベースのレンダリングシステムと四角形ベースのシステムに関するフレーズを見つけました。 クワッドベースのGPUまたはパイプラインに遭遇したことはありません。OpenGL 3.0+を扱うとき、それについて心配する必要がありますか、それとも単なるレガシーなものですか?
9 opengl  gpu 


4
可変長ループがGPUシェーダーに与える影響
デモシーンなど、GPU内で手続き型コンテンツをレンダリングするのが一般的です(画面いっぱいに1つの四角形を描画し、GPUにピクセルを計算させる)。 レイマーチングが人気です: これは、GPUがピクセルごとに不明な数のループ反復を実行していることを意味します(ただし、のような上限を設定できますmaxIterations)。 可変長ループがあると、シェーダーのパフォーマンスにどのような影響がありますか? 単純なレイマーチングの擬似コードを想像してみてください。 t = 0.f; while(t < maxDist) { p = rayStart + rayDir * t; d = DistanceFunc(p); t += d; if(d < epsilon) { ... emit p return; } } さまざまな主流のGPUファミリ(Nvidia、ATI、PowerVR、Mali、Intelなど)はどのように影響を受けますか?頂点シェーダー、特にフラグメントシェーダー? どのように最適化できますか?

3
初めてのシャドウマッピングの問題
OpenGLでシェーダーを使用して初めて基本的なシャドウマッピングを実装しましたが、いくつかの問題に直面しています。以下に、レンダリングされたシーンの例を示します。 私がフォローしているシャドウマッピングのプロセスは、光の視点からのビューマトリックスと、通常のレンダリングに使用される投影およびモデルマトリックスを使用して、シーンをフレームバッファーにレンダリングすることです。 2番目のパスでは、上記のMVPマトリックスをライトの視点から、位置をライトスペースに変換する頂点シェーダーに送信します。フラグメントシェーダーは遠近法による分割を行い、位置をテクスチャー座標に変更します。 これが私の頂点シェーダーです、 #version 150 core uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 MVPMatrix; uniform mat4 lightMVP; uniform float scale; in vec3 in_Position; in vec3 in_Normal; in vec2 in_TexCoord; smooth out vec3 pass_Normal; smooth out vec3 pass_Position; smooth out vec2 TexCoord; smooth out vec4 lightspace_Position; void main(void){ pass_Normal …

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