質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1245閲覧

XamarinにおけるiOS用OpenGL処理の設定で質問です

JpTomari

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2020/10/26 06:12

概要

初めまして。
当方、現在Xamarinを使用してiOS用のOpenGL環境を構築しているところです。
現在、FrameBufferのアタッチにおいて正常な動作ができず困っております。

ソースコード

html

1 public void CreateBuffer() 2 { 3 BackgroundColor = UIColor.Blue; 4 5 CGRect size = UIScreen.MainScreen.Bounds; 6 mWidth = (int)size.Width; 7 mHeight = (int)size.Height; 8 9 CAEAGLLayer layer = (CAEAGLLayer)this.Layer; 10 layer.Opaque = true; 11 12 // コンテキストの取得 13 mContext = new EAGLContext(EAGLRenderingAPI.OpenGLES1); 14 EAGLContext.SetCurrentContext(mContext); 15 16 GL.MatrixMode(All.Projection); 17 GL.LoadIdentity(); 18 19 // ビューポートの設定 20 GL.Viewport(0, 0, mWidth, mHeight); 21 GL.Scale(1.0f, -1.0f, 1.0f); 22 23 GL.EnableClientState(All.VertexArray); 24 GL.EnableClientState(All.TextureCoordArray); 25 26 // カリング処理の設定 27 GL.Disable((All)EnableCap.CullFace); 28 GL.FrontFace((All)FrontFaceDirection.Cw); 29 30 // 描画バッファの設定 31 GL.Oes.GenFramebuffers(1, out mFrameBuffer); 32 GL.Oes.BindFramebuffer(All.FramebufferOes, mFrameBuffer); 33 34 GL.Oes.GenRenderbuffers(1, out mRenderBuffer); 35 GL.Oes.BindRenderbuffer(All.RenderbufferOes, mRenderBuffer); 36 37 GL.Oes.GetRenderbufferParameter(All.RenderbufferOes, All.RenderbufferWidthOes, out mWidth); 38 GL.Oes.GetRenderbufferParameter(All.RenderbufferOes, All.RenderbufferHeightOes, out mHeight); 39 40 mContext.RenderBufferStorage((uint)All.RenderbufferOes, layer); 41 GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, mRenderBuffer); 42 43 if (GL.Oes.CheckFramebufferStatus(All.FramebufferOes) != All.FramebufferCompleteOes) 44 { 45 Console.WriteLine("failed!! {0}", GL.Oes.CheckFramebufferStatus(All.FramebufferOes)); 46 } 47 }

問題点

上記、CheckFrameBufferStatusメソッドにおいて、FramebufferIncompleteAttachmentOesが返っており
描画が行われない形になっております。
(背景色のみが表示され、バッファの背景色すら表示されない。)

何か必要な設定が足りていない、もしくは正しい設定がされていないなどがあるのでしょうか?
ご回答いただけると助かります。

捕捉

今回、当方での処理におきましては、OpenGLES1.1を使用することが前提となっております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

layerClassが以下の様に設定されているのでしょうか?確認してみて下さい。(もし、LayerプロパティをオーバーライドしてCAEAGLLayerを返している様であれば、それは削除して下さい)

C#

1[Export("layerClass")] 2public static Class LayerClass() 3{ 4 return new Class(typeof(CAEAGLLayer)); 5}

追記

CreateBufferは、ViewWillAppearのタイミングで呼ぶ様にしてみて下さい。

C#

1public override void ViewWillAppear(bool animated) 2{ 3 base.ViewWillAppear(animated); 4 5 mMainView.CreateBuffer(); 6}

投稿2020/10/26 09:12

編集2020/10/26 11:06
f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JpTomari

2020/10/26 09:43

ご回答ありがとうございます。 ご指摘の件ですが、同ソースファイルの別の場所で、上記の通りのクラスメソッドを作成しております。 念のため 'CAEAGLLayer layer = (CAEAGLLayer)this.Layer;' における、this修飾も外して見ましたが、上手く動作してくれません…。
f-miyu

2020/10/26 10:05

自分の環境ではこれで問題なかったのですが。ちなみに、CreateBufferはどのタイミングで呼ばれているのでしょうか?その辺のコードも示していただけると助かります。
JpTomari

2020/10/26 10:39

CreateBufferの呼び出しは、UIViewControllerのLoadViewで行っています。 ソースは以下の通りです。 (記法に慣れてないので、見づらい場合はご容赦ください。) ```C#:UIViewController public class TestViewController : UIViewController { //=================================================== // 定数参照 //=================================================== protected const int TIME_COUNT = 16 * 1000 * 1000; //=================================================== // 変数参照 //=================================================== protected Thread mThread = null; protected TestMain mMainView = null; //=================================================== // コンストラクタ //=================================================== public TestViewController() { } //=================================================== // 状態遷移処理 //=================================================== public override void DidReceiveMemoryWarning() { // Releases the view if it doesn't have a superview. base.DidReceiveMemoryWarning(); // Release any cached data, images, etc that aren't in use. } public override void ViewDidLoad() { base.ViewDidLoad(); startLoop(); } public override void LoadView() { base.LoadView(); mMainView = new TestMain(); this.View = mMainView; mMainView.SetController(this); mMainView.CreateBuffer(); } // 後略 ``` 必要でしたら、全ソースをアーカイブしてアップします。
f-miyu

2020/10/26 11:06

回答に追記しました
JpTomari

2020/10/26 11:17

解決いたしました! どうもiOSの状態遷移を正確に把握できていなかったようです。 再度その辺りを見直してみます。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問