ページ 11

openGL ESで、EAGLViewにc言語で描画は可能?

Posted: 2011年11月17日(木) 16:24
by stormrider
xcode4.2を使って開発しています。
objective-cでopenGL ESの描画をしていたのですが、
これをc言語での記述に書き換えています。
現在、objective-cで完成しているコードを部分的にcに置き換えているところです。

テクスチャの作成(glTexImage2D)まではc言語に置き換えられたのですが、
それ以降のglVertexPointerやglDrawElementsをc言語の関数内で実行すると、画面に表示されません。

http://webos-goodies.jp/archives/gettin ... phone.html
このサイトを参考に、EAGLEViewに設定したframebufferとcolorbuferをc言語の関数に送り、処理の前後で

コード:

glBindFramebufferOES(GL_FRAMEBUFFER_OES, frameBuffer);
 ...
glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorBuffer);
と挟んでみたのですが、やはりうまくいきません。
(openGLはプロパティを内部に保持しているので一度どこかで設定をすればこのような値のやりとりは
必要ないような気もするのですが、obj-cとほぼ同内容のソースをcに持ってくると途端に動かなくなるため、
思いつくことは手当たり次第試しています。)

macでc言語でopenGL ESとなるとネット上にもなかなか情報が見つかりません。
EAGLViewにc言語で描画するには、何が足りていないのでしょうか?

Re: openGL ESで、EAGLViewにc言語で描画は可能?

Posted: 2011年11月17日(木) 20:19
by ぬっち
OpenGLは使用したことがありますが、ESは無いのではっきりしたことは言えませんが、glEnableClientState(GL_VERTEX_ARRAY);
を忘れていたりとかはしませんか?

私はこれが無くて、表示されずちょっと悩んだことがあります。

Re: openGL ESで、EAGLViewにc言語で描画は可能?

Posted: 2011年11月18日(金) 12:37
by stormrider
glEnableClientState(GL_VERTEX_ARRAY)はobjective-cの部分でやってます。
念のためcの内部でも呼んでみましたがだめでした。
同じ内容のコード(文法が違うところは直してますが)なのに、
objective-cで書いたものを一部cに持ってきただけで
なぜ表示ができなくなるのか、どなたかおわかりにならないでしょうか。

Re: openGL ESで、EAGLViewにc言語で描画は可能?

Posted: 2011年11月18日(金) 16:36
by ISLe
スレッドコンテキストが異なるとか。
それで動かなくなるのはウィンドウズ上だけかもしれないですけど。

Re: openGL ESで、EAGLViewにc言語で描画は可能?

Posted: 2011年11月22日(火) 20:46
by stomrider
コンテキストというのが何なのかよくわかっておらずおまじない状態なのですが、解決はしました。

コード:

    EAGLContext *aContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
    self.context = aContext;
    [aContext release];
	
    self.view = [[EAGLView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    [(EAGLView *)self.view setContext:context];
最初は、EAGLViewとviewControllerで上記のようにコンテキストを共有した上で、
viewControllerがEAGLViewのメソッドを呼び出してコンテキストを設定し、
その後ViewControllerからopenGLの関数を呼び出して描画ができていました。

しかし、コンテキストを設定した後viewControllerからc言語の描画関数を呼び出すと、
画像が表示されなくなりました。

最終的に、EAGLViewの中でコンテキストを設定した後、
EAGLViewから直接cの描画関数を呼び出すとうまく行きました。

しかし、なぜこの方法ならよく、間にviewControllerから間接的に呼び出すのではいけないのか、疑問に思っています。
コンテキストはopenGlのClientStateなどのように、グローバルに保存されるものではないのでしょうか?

原理が気になっていますので、この説明で原因がお分かりになる方
いらっしゃいましたら、お教えいただけると助かります。