問題タブ [nsopenglview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - NSOpenGLView で nextEventMatchingMask から NSMouseMoved イベントを取得できません
典型的な勝利スタイルのイベントループを使用して、マウス入力で基本的なopenglウィンドウを作成しようとしています. NSMouseMoved
問題は、イベントを生成しようとして髪を引っ張っていることです。次のコードは、マウス アップ、マウス ダウン、マウス ドラッグなどに関するデバッグ情報を出力しますが、window に伝えてもマウス移動は出力しませんsetAcceptsMouseMovedEvents:YES
。では、次の例でマウスの動きを機能させる方法についてのアイデアはありますか?
明らかに、私がウィンドウを作成している方法は非常にココアに似ていませんが、いくつかのトリッキーなスレッド化を行うメイクファイルベースの Windows C++ コードベースを移植しようとしています。そういうわけで、私は を使用した win32 ループに似たスタイルにこだわっていますGetMsg()
。
また、ビルドするには、次を使用しています:
助けてくれてありがとう!
macos - NP(Netscape)WebプラグインのNSOpenGLView
NSOpenGLViewを使用してMacでNPWebプラグインを設定するためのリソース/例を知っている人はいますか?WebKit SVNのサンプルのいくつかを変更しようとしましたが、GLViewがロードされません。私がセットアップする方法は、サンプルがQuartz Composerレイヤーに保存するのと同じように、NSOpenGLViewレイヤーをメインプラグインレイヤーに保存することです。
誰かがこれを行うためのドキュメントを実際に見つけるためのヒントや提案があれば(グーグル検索はこれまで役に立たなかった)、それは大いにありがたいです。
cocoa - Cocoa / CoreGraphics/Quartz-丸みを帯びたエッジのあるウィンドウのようなボーダレスQuicktimeX
Mac OS X用のドキュメントベースのアプリケーションを開発しています。これは一種のメディアプレーヤーですが、オーディオまたはビデオファイルを再生する代わりに、OpenGLアニメーションを指定するメタデータを含むテキストファイルを開くことになっています。ApplesQuickTimeXウィンドウスタイルを模倣したいと思います。つまり、Cocoaには適切なウィンドウスタイルがないため、すべてのウィンドウ描画を自分で行う必要があります。
私に頭痛の種を与えることが1つあります。それは、MacOSXウィンドウで通常見られる丸い角です。ボーダレスウィンドウマスクを使用して、CGSの魔法を使ってみました。ウィンドウの整形を可能にするプライベートAppleヘッダーがいくつかありますが、もちろんそれらは文書化されていません。窓の端に長方形の穴を開けることはできたが、Appleがどのようにして角を丸くしたのか理解できなかった。
OpenGLビューポートは常に長方形であるため、透明なウィンドウを作成して自分でフレームを描画することはできません。これを変更する唯一の方法は、アルファ透明度のNSOpenGLCPSurfaceOpacityをオンにし、ステンシルバッファまたはシェーダーを使用してエッジを切り取る方法です。かなりのオーバーヘッドの地獄のようです。
OpenGLViewをタイトルバー付きの標準のCocoaウィンドウに配置すると、下端が丸くなります。これは、ビュー階層のNSThemeFrameステージで発生しているようです。これがどのように行われるかについてのアイデアはありますか?
objective-c - Interface Builder を使用しない OpenGL ビューの作成
だから私は(私のウィンドウで)openGLビューを作成しようとしています。ココアアプリを作っています。Interface Builder を使用して作成することができましたが、教育目的でそれなしで作成したいと考えています。紙の上だけ。
そして、これが私がそれに苦労しているとあなたに言っているポイントです。これまでに基本的に行ったことは次のとおりです。NSOpenGLView から継承する新しいクラス「MyOpenGLView.h/m」を作成しました。クラス名だけにプライベート変数やメソッドを追加しませんでした。私がした唯一のことは、initWithFrame をオーバーライドすることでした: (その中に self = [super initWithFrame:pixelFormat:] を追加します。) 使用する前に、まずこのようなものでインスタンス化する必要があることを Web で読みました) . コードは次のとおりです。
ビューを処理する「MyViewController.h/m」という名前の別のクラスがありますか? そこに私の MyOpenGLView *myView があります。.m ファイルでは、次のようなものを使用します。
もちろん、エラーが発生します。
ウィンドウ アプリケーションに移植された openGL ビューがありません。呼び出されるメソッドの階層について何かを推測しますが、もう一度..よくわかりません。それを手伝ってくれませんか?
macos - FBO: テクスチャへのレンダリング、レンダリングされたテクスチャを描画するときの間違ったテクスチャ マッピング
Mac OS X アプリケーションで OpengGL を使用して、NSOpenGLView
.
アプリはムービープレーヤーです。ムービー フレームをCVOpenGLTextureRef
(OpenGL テクスチャである) にデコードし、. を使用してビューに直接描画しますGL_QUAD
。すべてが正しく機能します。
以下は、コードの関連部分です。
それは問題なく動作し、ウィンドウのサイズを変更でき、テクスチャは小さいウィンドウに正しくマップされます。
フルスクリーンから 500x280 ピクセルまでのさまざまなウィンドウ サイズについては、こちらを参照してください。
テクスチャへのレンダリングに FBO を使用したいので、ムービー フレームをオフスクリーン FBO (テクスチャ) にレンダリングし、そのテクスチャをバインドして画面に描画するという非常に単純な実装を作成し始めました。
コードは次のとおりです。
イメージ/テクスチャが上下逆になっているだけでなく、テクスチャ マッピングも間違っているため、コードは正しく機能しません。ウィンドウが全画面の場合にのみ正しく機能し、それ以外の場合は非常に奇妙な動作をします。
下の画像を参照してください。
ご覧のとおり、テクスチャはウィンドウ内で正しくスケーリングされますが、全画面ウィンドウ サイズと実際のウィンドウ サイズの差に比例して「トリミング」されます。
私は成功せずにすべてを試しました。
OpenGL を使用するのはこれが初めてなので、何か不足していますか? 気が狂いそう..
cocoa - 複数のディスプレイでのOpenGL
複数使用していますNSOpenGLViews
。すべて、独自の画面に表示されるcontentView
のとして設定されます。NSWindow
すべてクラスで宣言されNSOpenGLViews
たメソッドを呼び出します。このクラスはすべての頂点を描画します。-(void)render:(NSOpenGLView *)sender;
Scene
すべてが正常に動作しますが、パフォーマンスはひどいものです。1つのディスプレイで、すべてが正常です(約500fps)。ディスプレイを追加すると、非常に遅くなります(約20fps)。
物事をスピードアップすることは可能ですか?
multithreading - NSOpenGLLayerを使用して別のスレッドから描画する
少なくともモニターのリフレッシュレートと同じリフレッシュレートでOpengGLを使用して描画する必要があるアプリに取り組んでいます。また、描画が激しいUIアクションによってロックされないように、別のスレッドで描画を実行する必要があります。
実はとNSOpenGLView
組み合わせて使っておりCVDisplayLink
、問題なく60-80FPSを達成することができます。
このビューの上にいくつかのココアコントロールも表示する必要があるため、 LayerBackedOpenGLView Appleの例NSOpenGLView
に従って、サブクラス化してレイヤーバックにしようとしました。
結果は満足のいくものではなく、多くのアーティファクトが発生します。
NSWindow
したがって、ココアコントロールをホストするために別のウィンドウを使用し、このウィンドウをを含むメインウィンドウの子ウィンドウとして追加することで問題を解決しましたNSOpenGLView
。それは正常に動作し、最初の実装とまったく同じFPSを取得できます。
私はこのソリューションを汚いハックのように考えているので、必要なものを達成するための代替のよりクリーンな方法を探しています。
数日前に出くわしNSOpenGLLayer
、それが私の問題の実行可能な解決策として使用できると思いました。
最後に、このすべての前文の後に、私の質問があります:コールバックNSOpenGLLayer
を使用して別のスレッドからに描画することは可能ですCVDisplayLink
か?
CVDisplayLink
これまでこれを実装しようとしましたが、コールバックから引き出すことができません。-setNeedsDisplay:TRUE
コールバックNSOpenGLLayer
からのみ実行でき、 cocoaによって自動的に呼び出されたときにCVDisplayLink
描画を実行できます。-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
でも、このようにメインスレッドから描いていると思いますよね?
これをグーグルで調べた後、私はこの投稿を見つけました。この投稿では、Lionの下での描画は内部でのみ発生する可能性があるとユーザーが主張しています-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
。
私は現在SnowLeopardを使用していますが、アプリはLionでも問題なく動作するはずです。
私は何かが足りないのですか?
objective-c - 2 つの NSOpenGLContext の間で共有されるのは正確には何ですか?
NSOpenGLContext を作成し、レンダリング エンジンを初期化してから、最初のコンテキストの共有パラメーターを使用して新しい NSOpenGLContexts を作成しようとしています。これは機能しません。先に進む前に、コンテキスト間で共有されるのは正確には何ですか? ドキュメントはこれに少し光を当てています:
共有コンテキストは、共有が開始される前後に作成されたすべてのテクスチャ オブジェクト、ディスプレイ リスト、頂点プログラム、フラグメント プログラム、およびバッファ オブジェクトを共有します。オブジェクトの状態も共有されますが、現在の色、テクスチャ座標設定、マトリックスと照明の設定、ラスタライズ状態、テクスチャ環境設定などの他のコンテキスト状態は共有されません。
最初の NSOpenGLContext を作成するとき、次の種類の呼び出しを行うレンダリング エンジンを初期化します。
- glGenTextures、glActiveTexture、glBindTexture
- glEnable
- glUseProgram、glGetAttribLocation、glGetUniformLocation
- glUniform1i、glUniform3f
- glGenVertexArraysAPPLE、glBindVertexArrayAPPLE、glBindBuffer
- glVertexAttribPointer、glEnableVertexAttribArray
それらのほとんどは、頂点およびシェーダー プログラムの作成、プログラム内の attrib および均一な場所への参照の保存、頂点配列の作成、およびいくつかのテクスチャのバインドという 3 種類のタスク用です。
これらすべてのアイテムがコンテキスト間で共有されると思いますか?
objective-c - OpenGLViewが表示されない
私はこのガイドに従いました。
13点目で何を言っているのかよくわからなかったのですが、インスペクターのペインを開いたところですが、どの属性を設定すればいいのかわかりません。ただし、コードをコピーして適切なクラスに貼り付けました。しかし、Objective-Cで空のウィンドウを持つ通常のプログラムを作成するときと同じように、三角形の描画がない通常のウィンドウが表示されます。
編集:
問題はウィンドウの初期化だと思ったので、drawRectメソッドを開始するためにawakeFromNibメソッドを作成しました。
しかし、drawRectの最初の命令で、EXC_BAD_ACCESS例外が発生します
たぶん、ウィンドウが正しく初期化されていませんか?
opengl - Photoshop Difference コンポジットを近似するために glBlendFunc を使用するにはどうすればよいですか?
glBlendFunc() を使用して、ある画像を別の画像に合成しています。フォトショップの差分合成機能を近似しようとしています。2 つの画像の類似点を黒く表示し、異なるものが飛び出すようにします。
私が理解しているように、 glBlendfunc() は、コンテキストで合成されたすべての画像に関連付けられています。あれは正しいですか?