NSOpenGLPixelFormat
を作成する際にパラメータの1つとしてNSOpenGLPFAColorFloat
を渡すときに何かがMacOSの10.12で破ったことが表示されます。私たちは基本的にAppleのDeep Image Display with OpenGLサンプルコードに沿って、30ビットカラー(RGBカラーチャンネルごとに10ビット)をサポートするディスプレイに広い色域の画像を表示しようとしています。広い色域(30ビット)レンダリングのためのmacOS 10.12(Sierra)のNSOpenGLPFAColorFloatが壊れていますか?
NSOpenGLPFAColorSize
が64(つまりRGBAピクセルあたり64ビット)に設定され、NSOpenGLPFAColorFloat
が有効(つまり16ビットのハーフフロートサブピクセル)に設定されたNSOpenGLPixelFormat
が作成されます。そのピクセル形式を使用して、各サブピクセルの16ビットハーフフロート値、つまり各RGBAピクセルの64ビットを使用するNSOpenGLContext
を作成します。
これは、すべてのMacOSの10.11で働いていました。しかし、10.12未満では、あたかも灰色または白のフレームと混ざっているかのように、OpenGLのウィンドウ全体がぼやけてレンダリングされます。ここでは、これは次のようになります - ウィンドウのタイトルバーが正しく濃い灰色にレンダリングされることに注意し、それ以下のすべての(私たちのOpenGLのビュー)が色あせている:
10.12(色あせ)
10.11(正しい)
私は、私たちのOpenGLことを確認しましたレンダリングは正しい。レンダリング後にフレームバッファの内容を読み取るのにglReadPixels()
を使用すると、フレームバッファの内容が正しい - 内容が色あせず、適切な "深い"(サブピクセルあたり8ビットより大きい)色を含んでいるデータ。色あせたレンダリングは、アプリの外のどこかで、おそらくウィンドウのコンポーザーなどで起こっているようです。したがって、これはmacOS 10.12のバグか、NSWindow、NSView、またはCAOpenGLLayerを設定するときに正しく実行されません。
AppleのDeep Image Display with OpenGLサンプルは10.12で正常に動作しているように見えません。しかし、それが動作する方法と私たちのアプリの動作方法にはいくつかの違いがあります。当社のピクセルフォーマットが若干異なります。
NSOpenGLPixelFormatAttribute attrs[] = {
NSOpenGLPFANoRecovery,
NSOpenGLPFAColorSize, 64,
NSOpenGLPFAColorFloat,
NSOpenGLPFADepthSize, 16,
NSOpenGLPFAAccelerated,
0
};
主な違いは、AppleのサンプルがNSOpenGLProfileVersion4_1Core
を使用していると我々は(プロファイルが指定されていない場合のデフォルト)をNSOpenGLProfileVersionLegacy
を使用していることです。したがって、4.1コアプロファイルでは動作しますが、レガシー(Pre-OpenGL 3.0)プロファイルでは動作しない可能性があります。
他の違いは、我々はOpenGLレンダリングを行うCAOpenGLLayer
のサブクラスでNSView
のサブクラスを使用している一方で、AppleのサンプルがNSOpenGLView
のサブクラスを使用していることです。私は問題がCAOpenGLLayer
であるかもしれないと思うが、私は本当に知らない。
NSWindow
,NSView
およびCAOpenGLLayer
には、広い色域/深い画像表示に関連して設定できるさまざまなプロパティがあります。しかし、これまでのところ、どれも影響を受けていません。私がこれまで試したのプロパティ:
NSWindow.depthLimit = NSWindowDepthSixtyfourBitRGB
NSView.wantsExtendedDynamicRangeOpenGLSurface = YES
CAOpenGLLayer.wantsExtendedDynamicRangeContent = YES
CALayer.contentsFormat = kCAContentsFormatRGBA16Float
私はかなり私はこの時点で考えることができるすべてを試してみました。誰かがヒントや提案を持っているなら、私は彼らに非常に感謝しています。
私の現在のコードベースではコアプロファイルが必要なので、すぐに設定を書き直すことはできませんが、ピクセルフォーマットについて少し奇妙なことは、深度バッファに16ビットを使用することです。私はあなたが誤って色のビット深度をZバッファの深度と混同している可能性があるかどうか疑問に思っています。私はこれが色空間の取り扱いにはまったく関連していないことを認識していますが、そのために奇妙なピクセルフォーマットが戻ってくる可能性があります。 – Falken
@Falken、 'NSOpenGLPFADepthSize'行をコメントアウトするか、16の代わりに32に設定しても同じ結果が得られます。私はAppleの[OpenGLを使ったディープ・イメージ・ディスプレイ](https://developer.apple.com/library/prerelease/content/samplecode/DeepImageDisplayWithOpenGL/Introduction/Intro.html)サンプルと同じピクセル・フォーマット・パラメータを使ってみましたNSOpenGLProfileVersion4_1Core'を使用してマイナス)、同じ結果が得られます。この動作を変更するように見える唯一のパラメータは、 'NSOpenGLPFAColorFloat'が有効なときです。 – Cutterpillow
ああ、それはとにかく暗闇の中のショットだった。 :)申し訳ありません私は今すぐ他のアイデアを持っていません。 – Falken