2016-11-19 7 views
0

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.12 (Faded)

10.11(正しい)

enter image description here

私は、私たちの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

私はかなり私はこの時点で考えることができるすべてを試してみました。誰かがヒントや提案を持っているなら、私は彼らに非常に感謝しています。

+0

私の現在のコードベースではコアプロファイルが必要なので、すぐに設定を書き直すことはできませんが、ピクセルフォーマットについて少し奇妙なことは、深度バッファに16ビットを使用することです。私はあなたが誤って色のビット深度をZバッファの深度と混同している可能性があるかどうか疑問に思っています。私はこれが色空間の取り扱いにはまったく関連していないことを認識していますが、そのために奇妙なピクセルフォーマットが戻ってくる可能性があります。 – Falken

+0

@Falken、 'NSOpenGLPFADepthSize'行をコメントアウトするか、16の代わりに32に設定しても同じ結果が得られます。私はAppleの[OpenGLを使ったディープ・イメージ・ディスプレイ](https://developer.apple.com/library/prerelease/content/samplecode/DeepImageDisplayWithOpenGL/Introduction/Intro.html)サンプルと同じピクセル・フォーマット・パラメータを使ってみましたNSOpenGLProfileVersion4_1Core'を使用してマイナス)、同じ結果が得られます。この動作を変更するように見える唯一のパラメータは、 'NSOpenGLPFAColorFloat'が有効なときです。 – Cutterpillow

+0

ああ、それはとにかく暗闇の中のショットだった。 :)申し訳ありません私は今すぐ他のアイデアを持っていません。 – Falken

答えて

0

CAOpenGLLayercolorspaceとウィンドウを確認してみてください。

広い色域に適していない場合は、変更してみてください。ウィンドウが良好だがレイヤーが適切でない場合は、ウィンドウのレイヤー(つまりlayer.colorspace = window.colorspace.CGColorSpace;)と一致するようにレイヤーを設定することをお勧めします。

それとも、ただのに役立ちますかどうかを確認するには、名前kCGColorSpaceSRGBkCGColorSpaceExtendedSRGBkCGColorSpaceLinearSRGBkCGColorSpaceExtendedLinearSRGB、またはkCGColorSpaceDisplayP3CGColorSpaceCreateWithName()にレイヤーの設定を試みることができます。

+0

これは実際にはうまくいくことに興味がありますが、それは私を心配しています。レイヤの色空間はデフォルトではNULLで、ドキュメントによっては次のようになります:_... ** nilの場合、カラーマッチングは行われません**非nilの場合、レンダリングされたコンテンツはこのレイヤを含むコンテキストの色空間にカラーマップされますディスプレイの色空間)。_私たちは自分自身で色を一致させるので、レイヤー上でカラーマッチングを望んでいません。色空間をウィンドウのそれに合わせるように設定すると、とにかく色が一致してはならないことを意味します。しかし、これは可能なColorSyncバグのようですか? – Cutterpillow

関連する問題