差分
ページの作成:「Xamarin.MacのNSOpenGLViewをRetina Displayに対応させる。 ==実装1== ===NSOpenGLViewを貼る=== Interface Builder でNSOpenGLViewを継承したカス...」
[[Xamarin.Mac]]のNSOpenGLViewを[[Retina Display]]に対応させる。
==実装1==
===NSOpenGLViewを貼る===
Interface Builder でNSOpenGLViewを継承したカスタムコントロールを貼る。
既にあるものをRetina対応させる場合は読み飛ばしてよい。
*[[Xamarin.Mac/NSOpenGLViewを使う]]も参照。
===Retina対応を有効にする===
Interface Builder のアトリビュートインスペクターで「Support Hi-Res BAcking」の項目にチェックを入れる。
これでNSOpenGLViewはRetinaに対応する。
[[ファイル:NSOpenGLView Hi-Resolution-Backing.png]]
===Retinaを考慮して描画する===
Retinaを有効にした場合はRetinaを考慮せず描画処理を行うとグダグダになるので注意しよう。
図形への影響は小さいが文字列の場合はさらに悲惨なことになるので特に注意すること。
この例ではConvertRectToBackingメソッドとGL.Viewportでサイズをあわせている。
Retinaと非Retinaでマルチディスプレイした状態でウインドウを移動してみると効果のほどがよくわかる。
<source lang="csharp">
public class MBOpenGLView : NSOpenGLView
{
// 〜〜〜省略〜〜〜
public override void DrawRect(CoreGraphics.CGRect dirtyRect)
{
// Retinaを考慮して描画する
var backingBounds = this.ConvertRectToBacking(this.Bounds);
GL.Viewport(0, 0, (int)backingBounds.Width, (int)backingBounds.Height);
using (var glc = this.OpenGLContext)
{
// コンテキストを有効化する
glc.MakeCurrentContext();
// 描画コマンド群
GL.Color3(0.7f, 0.2f, 0.2f);
GL.Begin(BeginMode.Triangles);
{
GL.Vertex3( 0.0f, 0.5f, 0.0f);
GL.Vertex3(-0.5f, -0.5f, 0.0f);
GL.Vertex3( 0.5f, -0.5f, 0.0f);
}
GL.End();
// キューに入ってる描画コマンド群を実行する
GL.Flush();
}// C#だとglc.Disposeのタイミングで画面描画を行うglc.FlushBafferも走る模様
}
}
</source>
==関連項目==
*[[Xamarin.Mac/Retina Displayか判別する]]
*[[Xamarin.Mac/NSOpenGLViewを使う]]
*[[Xamarin.Mac/カスタムコントロールを使用する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]
==実装1==
===NSOpenGLViewを貼る===
Interface Builder でNSOpenGLViewを継承したカスタムコントロールを貼る。
既にあるものをRetina対応させる場合は読み飛ばしてよい。
*[[Xamarin.Mac/NSOpenGLViewを使う]]も参照。
===Retina対応を有効にする===
Interface Builder のアトリビュートインスペクターで「Support Hi-Res BAcking」の項目にチェックを入れる。
これでNSOpenGLViewはRetinaに対応する。
[[ファイル:NSOpenGLView Hi-Resolution-Backing.png]]
===Retinaを考慮して描画する===
Retinaを有効にした場合はRetinaを考慮せず描画処理を行うとグダグダになるので注意しよう。
図形への影響は小さいが文字列の場合はさらに悲惨なことになるので特に注意すること。
この例ではConvertRectToBackingメソッドとGL.Viewportでサイズをあわせている。
Retinaと非Retinaでマルチディスプレイした状態でウインドウを移動してみると効果のほどがよくわかる。
<source lang="csharp">
public class MBOpenGLView : NSOpenGLView
{
// 〜〜〜省略〜〜〜
public override void DrawRect(CoreGraphics.CGRect dirtyRect)
{
// Retinaを考慮して描画する
var backingBounds = this.ConvertRectToBacking(this.Bounds);
GL.Viewport(0, 0, (int)backingBounds.Width, (int)backingBounds.Height);
using (var glc = this.OpenGLContext)
{
// コンテキストを有効化する
glc.MakeCurrentContext();
// 描画コマンド群
GL.Color3(0.7f, 0.2f, 0.2f);
GL.Begin(BeginMode.Triangles);
{
GL.Vertex3( 0.0f, 0.5f, 0.0f);
GL.Vertex3(-0.5f, -0.5f, 0.0f);
GL.Vertex3( 0.5f, -0.5f, 0.0f);
}
GL.End();
// キューに入ってる描画コマンド群を実行する
GL.Flush();
}// C#だとglc.Disposeのタイミングで画面描画を行うglc.FlushBafferも走る模様
}
}
</source>
==関連項目==
*[[Xamarin.Mac/Retina Displayか判別する]]
*[[Xamarin.Mac/NSOpenGLViewを使う]]
*[[Xamarin.Mac/カスタムコントロールを使用する]]
==参考文献==
{{reflist}}
{{stub}}
[[category:Xamarin.Mac]]